我在shell腳本中有一個要求,如果shell由於某種原因終止I.e終端關閉或用戶終止,我想做一些工作,如清理和解鎖等。可能嗎?如果是這樣,請解釋如何完成。 在此先感謝, Praveen P BShell腳本終止通知
2
A
回答
7
是的,這是可能的。使用trap
命令檢查信號。見help trap
。
例
cleanup() {
...
exit
}
trap cleanup SIGINT # user terminated
trap cleanup SIGHUP # terminal closed
trap cleanup SIGTERM # killed with kill -15
1
什麼@Grzegorz說,是正確的,但要注意以下幾點:
你沒有標明OS(和外殼,但我們假設
sh
) ,所以要保持POSIXly正確,你應該使用大寫信號名稱(如SIGINT
)。另見here。除非您想讓腳本繼續運行,否則在收到信號後,應該將
exit
作爲「清理」功能的最後一行。不要忘記在以其他方式退出腳本之前(即在「結束」或在您手動呼叫
exit
之前)手動調用您的「清除」功能。或者用trap cleanup EXIT
註冊一個處理程序。請注意,您不能通過這種方式(或任何其他方式)趕上
SIGKILL
,即kill -9 <mypid>
。因此,請確保您可以以某種方式處理清理可能實際上而不是發生的事實。例如,在腳本初始化期間檢查舊的(孤立的)鎖定文件是否仍然存在,並退出時出現錯誤,並通知用戶/管理員手動清除。現在,區分合法存在的鎖文件和被殺實例的剩餘文件可能不是微不足道的,主要取決於您的腳本。您可以將腳本PID寫入鎖定文件,然後,如果腳本(另一個實例)發現鎖定文件時存在鎖定文件,請確保具有該PID的進程仍然存在,如果存在,機會另一個腳本實例是真正運行的。否則,手動清理可能是必要的。但即使這不是100%安全的。
+0
謝謝,更新了我對POSIX兼容性和退出調用的回答。 –
相關問題
- 1. Python uTorrent通知腳本不會終止
- 2. 如何終止一個MongoDb shell腳本?
- 3. 後臺shell腳本自動終止
- 4. shell腳本終止程序,但不是腳本本身
- 5. 試圖通過shell腳本來終止進程
- 6. 如何通過shell腳本設置PATH環境變量,儘管該shell腳本終止?
- 7. 通過shell腳本
- 8. 通過shell腳本
- 9. C++對象終止通知
- 10. 在本身內部過濾shell腳本輸出,腳本沒有終止
- 11. shell腳本停止錯誤
- 12. bash腳本SFTP退出終止腳本
- 13. 在調用shell腳本中終止正在運行的程序
- 14. 終止正在運行的命令時,shell腳本被殺害
- 15. 用shell/bash腳本終止谷歌雲計算引擎實例
- 16. 孤兒(ksh Shell腳本在CTRL-X時不會先終止)
- 17. 如何在指定時間後終止shell腳本
- 18. 如何在shell腳本中終止cat pipe命令?
- 19. 使用shell腳本來自動終止進程
- 20. 如何從shell腳本中終止JVM運行?
- 21. VBA - 通過Shell終止Internet Explorer進程
- 22. 終止Shell命令
- 23. 立即終止腳本
- 24. 終止一個IronPython腳本
- 25. Cron終止Python腳本?
- 26. cron作業腳本終止
- 27. 腳本不終止立即
- 28. 終止從foo腳本
- 29. 使用phpexcel終止腳本
- 30. 如何終止Lua腳本?
+1。次要評論:只有SIGKILL或SIGSTOP不能被捕獲。但是SIGSTOP並沒有真正殺死進程,只是停止它直到收到SIGCONT。 – TrueY