本人在寫腳本重啟動過程遇到坑,分享給大家,避免大家誤入同樣的坑。
需求:編寫Squid重啟動腳本。每天夜間12定時重啟動
- 重啟腳本思路: 1、停止服務進程,kill 可以搞定 2、啟動進程,知道服務如何啟動即可
問題現象(坑):執行任務并不能重啟動。kill 進程后,直接停止了。不執行后續啟動服務命令
- 腳本:
[root@test scripts]# more squid.sh #!/bin/bash source /etc/profile kill -9 $(ps -ef |grep "squid" |grep -v "grep" |awk '{print $2}') ps aux |grep squid sleep 1 /usr/sbin/squid -f /etc/squid/squid.conf ps aux |grep squid
進程圖
- 執行腳本,重啟動提示killd錯誤
[root@test scripts]# sh -x squid.sh + source /etc/profile ++ '[' -x /usr/bin/id ']' ++ '[' -z 0 ']' +++ /usr/bin/id -un ++ USER=root ++ LOGNAME=root ++ MAIL=/var/spool/mail/root ++ '[' 0 = 0 ']' ++ pathmunge /usr/sbin ... ... +++ alias 'which=alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde' ++ unset i ++ unset -f pathmunge +++ whoami ++ export 'HISTTIMEFORMAT=%F %T root ' ++ HISTTIMEFORMAT='%F %T root ' + stop ++ ps -ef ++ grep --color=auto squid ++ grep --color=auto -v grep ++ awk '{print $2}' + kill -9 15556 15561 15565 16376 16397 Killed
問題原因
由于執行squid.sh 腳本時,直接將當前shell腳本一起kill 掉了。造成后續啟動服務命令沒有執行。
解決方法
- 方法一:更換腳本名稱,將squid.sh 修改為test.sh 。程序運行正常(能夠正常啟動) 主要是因為上面腳本,查找關鍵字"squid"時,直接將腳本自身也kill掉了。
- 方法二: 修改腳本
#!/bin/bash source /etc/profile kill -9 $(ps -ef |grep "/usr/sbin/squid -f /etc/squid/squid.conf" |grep -v "grep" |awk '{print $2}') kill -9 $(ps -ef |grep "/var/log/squid/access.log" |grep -v "grep" |awk '{print $2}') ps aux |grep squid sleep 1 /usr/sbin/squid -f /etc/squid/squid.conf echo "squid is restart $(date)" >> /data/logs/squid.log
總結
- 進程重啟動, 定位服務時,一定要精確定位。不要使用模糊匹配。匹配不好就入坑。