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
編譯安裝的如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例)
示例:
- 顯示所有用戶默認是/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
例如:
- 以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![]()
- 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
- 統計狀態:
~]# 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例)

- 隨機數
~]# 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
系統啟動過程寫的簡單了,可以再深入一下,systemd的實現和awk的例子非常不錯,繼續加油~