systemd、awk命令 N28

第八周-2018 1/22

1、簡述systemd的新特性及unit常見類型分析,能夠實現編譯安裝的如nginx\apache實現通過systemd來管理

系統啟動流程

內核空間 –> 用戶空間

  • 內核空間
  • 初始化
  • ro掛載rootfs
  • 啟動init進程
  • 用戶空間
  • 默認運行級別
  • 初始化
  • 啟動或停止服務
  • 打印登陸提示符

用戶空間初始化程序

  • c5: init: 串行啟動程序
  • c6: upstart:基于dbus信號完成并行啟動
  • c7: systemd: 并行啟動進程

systemd進程特性

1)并行啟動進程
2)按需啟動進程
3)快照
4)基于依賴關系定義服務控制邏輯

unit類型

  • .service: 定義系統服務,扮演/etc/rc.d/init.d/* 各服務腳本。
  • .target:模擬“運行級別”。
  • .device:定義內核識別的設備。
  • .mount:定義文件系統掛載點。
  • .socket:標識進程間通信的socket文件。
  • .snapshot:管理系統快照。
  • .swap:標識swap設備。
  • .automount:文件系統自動掛載點設置。
  • .path:定義文件系統中的一個文件或目錄。

unit文件路徑

 /usr/lib/systemd/system
 /run/systemd/system
 /etc/systemd/system

systemd

systemd1

systemd3

編譯安裝的如nginx\apache實現通過systemd來管理

 ~]# yum -y groupinstall "Development Tools" "Server Platform Development"


apache
 ~]# wget http://mirrors.tuna.tsinghua.edu.cn/apache//httpd/httpd-2.2.34.tar.gz
 ~]# tar xf httpd-2.2.34.tar.gz
 ~]# cd httpd-2.2.34
 [root@localhost httpd-2.2.29]# ./configure --prefix=/usr/local/apache2 --sysconfdir=/etc/apache2
 [root@localhost httpd-2.2.29]# make -j 4
 [root@localhost httpd-2.2.29]# make install 
 ~]# vim /etc/rc.d/init.d/httpd
#!/bin/bash
#
# httpd Startup script for the Apache HTTP Server
#
# chkconfig: - 85 15
# description: The Apache HTTP Server is an efficient and extensible \
# server implementing the current HTTP standards.

if [ -f /etc/sysconfig/httpd ]; then
 . /etc/sysconfig/httpd
fi
prog=${HTTPD-/usr/local/apache2/bin/httpd}
[ -L /usr/sbin/httpd ] || ln -sv $prog /usr/sbin
lockfile=${LOCKFILE-/var/lock/subsys/httpd}
prog=$(basename $prog)

check_prog() {
 [ -f $lockfile ] && RETVAL=0 || RETVAL=1
 return $RETVAL
}

lcc_start() {
 check_prog
 if [ $RETVAL -eq 0 ]; then
 echo "$prog is started."
 else
 #$prog $OPTIONS -DFOREGROUND
 $prog $OPTIONS 
 if [ $? -eq 0 ]; then
 touch $lockfile
 echo "$prog start ok"
 else
 echo "$prog start fail"
 fi
 fi
 
}
lcc_stop() {
 check_prog
 if [ $RETVAL -eq 0 ]; then
 kill -9 `pgrep $prog` &> /dev/null
 rm -f $lockfile
 [ $? -eq 0 ] && echo "$prog stop finished." || echo "$prog stop fail."
 else
 echo "$prog is stopped."
 fi
}
lcc_restart() {
 lcc_stop
 lcc_start
}
lcc_status() {
 check_prog
 [ $? -eq 0 ] && echo "$prog is running." || echo "$prog is stopping"
}

case "$1" in
 start|stop|restart|status)
 lcc_$1
 ;;
 *)
 echo $"Usage: $prog {start|stop|restart|status}"
 RETVAL=2
 ;;
esac

exit $RETVAL
 ~]# chkconfig --add httpd
 nginx
 wget https://nginx.org/download/nginx-1.12.2.tar.gz
 yum -y groupinstall "Development Tools" "Server Platform Development"
 yum -y install pcre-devel openssl-devel
 yum -y install zlib-devel libxml2-devel libxslt-devel gd-devel perl-devel GeoIP-devel perl-ExtUtils-Embed

tar xf nginx-1.12.2.tar.gz 
cd nginx-1.12.2
 ./configure --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nginx --group=nginx --with-file-aio 
 make && make install
cat > /usr/lib/systemd/system/nginx.service << EOF
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF

 systemctl daemon-reload
 useradd -r nginx
 install -d -o nginx -g nginx /var/lib/nginx/tmp/client_body
 systemctl start nginx.service
 systemctl status nginx.service

2、描述awk命令用法及示例(至少3例)

awk1

awk2

awk9

awk3

awk4

awk5

示例:

  • 顯示所有用戶默認是/bin/bash的詳細信息
~]# awk -F: '$NF=="/bin/bash"{print}' /etc/passwd
  • 顯示第3至5行的所有/etc/passwd中的信息
~]# awk -F: 'NR>=3&&NR<=5{print}' /etc/passwd
  • 匹配以bash結尾的行
~]# awk -F: '$NF~/bash$/{print}' /etc/passwd
  • ID號為偶數就顯示

~]# awk ‘$3%2==0{print}’ /etc/passwd

awk6

例如:

 

  • 以UUID開頭的行,顯示
 ~]# awk '/^UUID/{print}' /etc/fstab
  • 非UUID開頭的行,顯示
 ~]# awk '!/^UUID/{print}' /etc/fstab
  • ID大于30,顯示
 ~]# awk '$3>30{print}' /etc/passwd
  • 顯示表頭:
  ~]# awk 'BEGIN{print " username uid \n----------"}'
  • 顯示結尾:
  ~]# awk 'END{print "=======================\n END "}'
  • 顯示用戶名及默認shell
 ~]# awk -F: 'BEGIN{print "----START---"}{printf "%25s %s\n",$1,$NF}END{print "---END---"}' /etc/passwd


awk7

  • id大于等于1000普通用戶

~]# awk -F: ‘{if($3>=1000){print $1,”Common User”} else {print $1,”root or Sysuser”}}’ /etc/passwd

  • 顯示每行第字段長度

~]# awk ‘{i=1;while(i<=NF) {print $i,length($i);i++}}’ /etc/fstab
~]# awk ‘{for(i=1;i<=NF;i++) {print $i,length($i)}}’ /etc/fstab

  • 循環嵌套, 字段長度大于7時顯示

~]# awk ‘{i=1;while(i<=NF) {if(length($i)>7){print $i,length($i)};i++}}’ /etc/fstab
~]# awk ‘{for(i=1;i<=NF;i++) {if(length($i)>7){print $i,length($i)}}}’ /etc/fstab

awk8

  • 統計狀態:
~]# netstat -tan | awk '/^tcp\>/{state[$NF]++} END{for(i in state) {print i,state[i]}}'
  • 統計IP
    ~]# awk '{ip[$1]++} END{for(i in ip) {print i,ip[i]}}' /var/log/httpd/access_log
  • 統計流量
 ~]# awk '{a+=1} END{print a}' /var/log/httpd/access_log
 假如每個訪問1kb消耗,那么最終消耗...

3、描述awk函數示例(至少3例)
awk10

  • 隨機數
 ~]# awk 'BEGIN{print rand()}'
  • 返回字段長度
 ~]# awk -F: '{print $1,length($1)}' /etc/passwd
  • 將/etc/passwd中$1的o替換為O,第一次出現替換.
 ~]# awk -F: '{sub("o","O",$1);print $1}' /etc/passwd
  • 將/etc/passwd中$1的o替換為O,所有出現替換.
 ~]# awk -F: '{gsub("o","O",$1);print $1}' /etc/passwd
  • df -h中Use%大于等于80就顯示
?~]# df -lhP | awk '/^\/dev/{split($5,state,"%"); if (state[1]>=80)print }'
  • 統計ip
?~]# netstat -tnl | grep "^tcp\>" | awk '{split($4,ip,":");count[ip[1]]++} END{for(i in count) {print i,count[i]}}'











 

 

 

 

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/91256

(0)
逆神陽逆神陽
上一篇 2018-01-22
下一篇 2018-01-23

相關推薦

  • 一起學WINS系列(二)安裝、配置

    原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://jeffyyko.blog.51cto.com/28563/159128  此系列第二節:安裝服務端、配置客戶端。          完整的WINS系統…

    Linux干貨 2015-03-25
  • bind的安裝實現

    首先介紹一下我的測試環境:centos 7+入網(為了試行一下自己的安裝文檔,才裝的虛擬機) 1> yum install bind bind-chroot -y     因為剛剛安裝的虛擬機,這里我就不檢查了; 2>vim named.conf [root@localhost named]# cat /e…

    Linux干貨 2016-03-20
  • 第二周學習總結

    寫在最前 通過上一周對計算機系統、Linux發展的學習,我們認識到了Linux是一個一切皆文件的內核系統。那么怎樣去操作系統上的各文件來達到你想要的目的呢?今天的總結就是幫助我們更快的達成目標。 文件管理類命令的分類 對于這類命令主要分為兩類: 操作類:touch、cp、mv 查看類:cat、tac、head、tail、less、more touch 功能描…

    2017-12-16
  • DNS的基本配置、子域授權與bind編譯(第十八九天)

        DNS( Domain Name System)是“域名系統”的英文縮寫,是一種組織成域層次結構的計算機和網絡服務命名系統,它用于TCP/IP網絡,它所提供的服務是用來將主機名和域名轉換為IP地址的工作。     DNS利用類似于樹形目錄的結構,將主機名的管理分配在不同層…

    Linux干貨 2016-06-12
  • 進程管理

    1、ps命令 查看當前時刻的進程狀態,通過此命令可以確定有哪些進程正在運行和運行的狀態、進程是否結束、進程有沒有僵死、哪些進程占用了過多的資源等等 進程狀態:     運行態:running     就緒態:ready     睡眠態: &…

    Linux干貨 2016-09-10

評論列表(1條)

  • 馬哥教育
    馬哥教育 2018-01-23 23:46

    系統啟動過程寫的簡單了,可以再深入一下,systemd的實現和awk的例子非常不錯,繼續加油~

欧美性久久久久