簡體   English   中英

監視Linux中進程的啟動

[英]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。

您應該使用pgreppkill

要回答您的主要問題,請將您的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM