
我經常忘記添加&& shutdown -h now
到長期運作的流程中。有什麼辦法可以加入shutdown -h now
指令後第一個命令被呼叫?它無意中中斷正在進行的過程。也許可以看PID?
答案1
無需重複執行 ps 來列出所有進程並透過輸出執行 grep。使用 ctrl-Z 將進程置於後台,然後執行
bg %1 ; wait %1 ; shutdown -h now
如果您正在執行其他背景作業,那麼當您按 ctrl-z 時,您將獲得不同的作業規格而不是 [1]。如果是這樣,請改用它。
答案2
我一直這樣做。
- 開始該過程。
- 意識到我忘記執行
&&
命令了。 - 按Ctrl+Z暫停進程並返回 shell。
- 跑向
fg && shutdown -h now
:- 前台並恢復剛剛暫停的進程。
- 然後,完成後,它將運行您想要運行的內容。
或者,您可以按照其他答案中的建議進行輪詢,如下所示:
while ps -p $PID ; do sleep 5 ; done ; shutdown -h now
答案3
您可以執行以下操作,這將檢查該進程是否每 5 秒運行一次並採取適當的操作:
while true; do
if ps -ef | grep -q '[l]ong-running-process'; then
sleep 5
else
sudo poweroff
fi
done
請注意表達式中的方括號grep
。這是為了確保該grep
進程在清單中結束時不會被匹配ps
。用方括號包圍任何單一字元就足夠了。
答案4
寫一個 shell 腳本來執行這兩個進程:
MyShellScript.txt:
#!/bin/sh
MyProcessIdLikeToStart -o options && shutdown -h now
將其保存在啟動給定進程的目錄中後,執行以下操作:
chmod +x MyShellScript.txt
然後,當您想執行該命令時,只需鍵入即可./MyShellScript.txt
,它會為您完成這兩件事。