在開發環境下,我們經常需要部署代碼,重啓服務,所以會把命令寫在腳本中,方便使用。
我們可能這麼寫
#!/bin/bash ps -ef | grep backend-api-1.0 | grep -v "\-\-color" |awk '{print $2}' |xargs kill -9 sleep 1 nohup java -jar backend-api-1.0.jar >> backend-api.log 2>&1 & tail -f backend-api.log
這個腳本看似沒問題,可執行時,會出現kill: 向 PID 發送信號失敗: 沒有那個進程
的錯誤,但是服務仍然能正常重啓,也就是ps -ef | grep backend-api-1.0 | grep -v "\-\-color"
這個命令並沒有把當前執行進程過濾掉。
正確寫法是:取項目名中的兩個不同的單詞,用兩次grep
,而不是用grep -v
,如下
#!/bin/bash ps -ef | grep backend | grep api |awk '{print $2}' |xargs kill -9 sleep 1 nohup java -jar backend-api-1.0.jar >> backend-api.log 2>&1 & tail -f backend-api.log