(第九周作業(yè))
1、?systemd查看日志文件有隱藏該如何處理?
systemd統(tǒng)一管理所有Unit的啟動日志,包含內(nèi)核日志和應(yīng)用日志。在默認(rèn)情況下,systemd日志保存于/run/log/journal中,系統(tǒng)重啟后會清除,這里面的日志文件是二進(jìn)制形式保存的,不能直接用less等文本文件查看的方式查看內(nèi)容。
可以使用下面這個命令來查看日志內(nèi)容,由于一行可以顯示很多內(nèi)容,屏幕的列數(shù)可能無法顯示完整,可以使用右方向鍵查看右邊的內(nèi)容。
$ journalctl
日志文件還有更詳細(xì)的信息,使用下面這個參數(shù) 顯示隱藏字段
journalctl? -o verbose
-o?或 --output=STRING?來改變journal命令輸出的模式,可選的模式有 (short, short-iso,?short-precise, short-monotonic, verbose,export, json, json-pretty, json-sse, cat)
2、?自己動手寫一個systemd的配置文件,?讓nginx服務(wù)可以開機(jī)啟動:
# cd?/etc/systemd/system?
# vi nginx.service
[Unit]
Description=nginx web server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
[Install]
WantedBy=multi-user.target
說明:
此文件分成三段:[Unit]、[Service]和[Install],
其中[Unit]段主要定義與類型無關(guān)的通用選項(xiàng),這里定義了Description表示描述信息,將會顯示在systemctl status nginx.service命令的輸出內(nèi)容中。After定義了要在這行所列出的服務(wù)啟動后才能啟動Nginx服務(wù)。
[Service]段主要定義了與Service類型相關(guān)的專用選項(xiàng)。這里定義了以下選項(xiàng):
? ? Type=forking,它表示后面定義的ExecStart的主進(jìn)程生成的其中一個子進(jìn)程將被提升成為主進(jìn)程,啟動完成后,舊的主進(jìn)程會退出。
? ??PIDFile=...,它表示pid文件的所在位置
? ??ExecStart選項(xiàng)定義Nginx的啟動命令,注意使用全路徑來寫
? ??ExecReload選項(xiàng)定義Nginx的重新加載配置文件等
? ??ExecStop選項(xiàng)定義Nginx的服務(wù)停止命令
[Install]段主要定義了服務(wù)啟動或禁用時的一些選項(xiàng),這里定義了WantedBy表示被后面所列服務(wù)所依賴。
注意,編寫了Nginx的unit文件之后。需要通知systemd重載此配置文件,命令如下:
# systemctl daemon-reload
3、?SIGHUP、SIGQUIT、SIGTERM、SIGINTERRUPT的區(qū)別
通過命令man 7 signal來查看每個信號的含義。
SIGHUP?控制終端關(guān)閉或控制進(jìn)程退出時,終端會話內(nèi)的子進(jìn)程與控制進(jìn)程的子進(jìn)程都會收到這樣的信號,系統(tǒng)對SIGHUP信號的默認(rèn)處理是終止收到該信號的進(jìn)程。所以若程序中沒有捕捉該信號,當(dāng)收到該信號時,進(jìn)程就會退出。
SIGQUIT??和SIGINT類似, 但由QUIT字符(通常是Ctrl-\? )來控制. 進(jìn)程在因收到SIGQUIT退出時會產(chǎn)生core文件, 類似于一個程序錯誤信號。
SIGTERM程序結(jié)束(terminate)信號, 與SIGKILL不同的是該信號可以被阻塞和處理。通常用來要求程序自己正常退出,shell命令kill缺省產(chǎn)生這個信號。如果進(jìn)程終止不了,我們才會嘗試SIGKILL,就是我們有時使用kill -9 pid來強(qiáng)行殺死進(jìn)程。
SIGINTERRUPT? ?程序終止(interrupt)信號, 在用戶鍵入INTR字符(通常是Ctrl-C)時發(fā)出,用于通知前臺進(jìn)程組終止進(jìn)程。
4、?用awk查看tcp連接處于TIMEOUT的連接個數(shù)
netstat -an |awk '/^tcp\>/ {if($NF=="TIMEOUT")sum++} END{print sum}'
說明如下:netstat -an?可以顯示當(dāng)前所有的網(wǎng)絡(luò)連接。awk?是按行處理的文本處理程序?
/^tcp\>/表示以tcp單詞開頭的行,這些行都是tcp連接,因?yàn)橛行┬惺莟cp6所以加上\>來錨定詞尾。
$NF=="TIMEOUT"?這個條件中$NF表示每一行的最后一列,因?yàn)镹F是一行最大的列數(shù),如果一行有3列值,則NF為3,$NF就表示最后一列。因網(wǎng)絡(luò)連接的狀態(tài)值在netstat -an?輸出內(nèi)容里面為最后一列。所以要用$NF來取出網(wǎng)絡(luò)連接狀態(tài),然后用==與"TIMEOUT"進(jìn)行比較。如果相等就執(zhí)行后面的sum++表示sum自增值,我們要統(tǒng)計這一狀態(tài)的連接數(shù)就要這樣做。注意這里要用==而不是一個=號,要不然會變成賦值而不是比較。
END{print sum}?表示處理完所有的行,然后執(zhí)行打印sum的值。