前些天在執行restart腳本的時候遇到了一個奇怪的問題:
1、第一次執行進程不見了,啟動失敗
2、第二次重啟進程成功,但是在kill的時候提示進程不存在
需要重啟兩次進程才能成功
查看日志文件:
第一次重啟失敗是因為端口被占用,那么意味着進程沒有被kill掉。第二次kill提示進程不存在則是因為
在第一次重啟進程的時候寫入了新的進程號(然后在綁定端口監聽的時候發現端口被占用,進程啟動失敗)
接下來需要研究的是,在執行了kill之后進程為什么沒有立刻被kill掉,查資料發現:
也就是說執行kill以后,信號被放在了pending對列中,下一次cpu調度這個進程耗時較長。
查看了一下,系統600多個進程,所以暫時的處理辦法是先sleep 0.1s,然后再執行kill命令
參考:
1、當執行kill -9 PID時系統發生了什么
2、Linux進程狀態:D
附:重啟腳本
#!/bin/bash BASEDIR=$(cd "$(dirname "$0")";pwd) PID=./bin/process.pid # kill server if [ -e "$PID" ]; then cat "${BASEDIR}"/bin/process.pid | xargs kill -9 sleep 0.1 rm -rf ${BASEDIR}/bin/process.pid echo "stop process success..." fi mkdir -p ${BASEDIR}/log # start server as daemon cd ${BASEDIR}/bin chmod +x ./process nohup ./** >> ${BASEDIR}/log/out.log 2>&1 & echo "restart process server success..."