[英]Monitoring the launch of process in Linux
我要編寫一個旨在殺死進程的腳本。 如果啟動了此進程,則它將立即終止;如果未啟動此進程,則它將執行無限循環,直到檢測到指定進程的存在。(進程的名稱由用戶鍵入)。 循環中的指令代碼將在每次迭代時將此循環延遲10秒,以免過度消耗系統資源。 Shell會定期檢查啟動過程的存在與否。 該腳本應在以下情況下結束:-它跟蹤啟動的進程-或當用戶退出應用程序(進程)到目前為止,當我的腳本檢測到啟動進程時,它終止了該進程並退出,但沒有退出當用戶退出應用程序時,它將繼續循環。 實際上,我現在實際上並不真正如何檢測用戶是否已退出應用程序。 有什么想法嗎? 提前致謝。
#!/bin/sh
echo "Enter the name of the process to monitor "
read nom
while :
do
compteur=` ps -u $USER | grep $nom | cut -d " " -f2 `
if [ $compteur >0 ]
then
kill $compteur
echo " Process terminated "
exit 1
else
echo " Searching $nom... "
fi
sleep 10;
done
我最近了解到,通常不建議按名稱殺死進程,而應按進程ID(pid)殺死進程,這假定您要管理父/子pid。
在你的情況,你應該在仔細一看這個 ,下面這些檢查點,都在我剛給的鏈接描述:
獲取啟動的進程ID
檢查該進程是否仍在運行
等待pid正常結束(例如,通常退出狀態碼0)
終止正在運行的進程
這行不通:
if [ $compteur >0 ]
在Bourne shell( #!/bin/sh
)中,它必須是:
if [ $compteur -gt 0 ]
或在Bash( #!/bin/bash
)中可以是上一個或:
if [[ $compteur -gt 0 ]]
要么
if (( compteur > 0 ))
也就是說,如果您要進行數字比較。 您的ps
命令不可靠,因為PID的前導空格會使其無效,並且由於至少兩個原因,您會得到假肯定。 另外,至少在我的系統上, ps -u username
在第一列中輸出PID。
您應該使用pgrep
和pkill
。
要回答您的主要問題,請將您的while :
永久)更改為:
while pkill -0 $PID
因此,您的腳本應類似於:
#!/bin/sh
echo "Enter the name of the process to monitor "
read nom
compteur=`pgrep -U $USER "$nom"`
while pkill -0 $compteur 2>/dev/null
do
sleep 10
kill $compteur && echo " Process terminated "
done
但是,另一個問題是如果存在多個這樣的過程,該怎么辦。
請參閱流程管理以獲取更多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.