Linux

如何在 pid 未知時終止 Linux 中的後台程序?

  • March 20, 2018

我有一個包含以下程式碼的作業調度程序 bash shell 腳本:

for (( i=0; i<$toBeDoneNum; i=i+1 ))
do
   while true
   do
           processNum=`ps aux | grep Checking | wc -l`
           if [ $processNum -lt $maxProcessNum ]; then
               break
           fi
           echo "Too many processes: Max process is $maxProcessNum."
           sleep $sleepSec
   done
   java -classpath ".:./conf:./lib/*" odx.comm.cwv.main.Checking $i
done

我在後台執行這樣的腳本:

./dispatcher.sh &

我想用kill -9. 但是我第一時間沒有記錄dispatcher程序的pid。我使用了工作jobs -ljobs -rjobs -s。什麼也沒顯示。即使這樣fg也不能將程序帶到前台。

fg
bash: fg: current: no such job

但我認為這個調度程序程序仍在執行,因為它仍然繼續分配 java 程序執行(已使用頂部和ps -ef檢查)。我應該如何終止這個作業調度程序 bash shell 腳本程序?

您應該能夠使用該pkill命令按名稱殺死腳本。

$ pkill -9 dispatcher.sh

摘自手冊頁

pgrep, pkill - look up or signal processes based on name and other 
              attributes

OPTIONS
      -signal
      --signal signal
             Defines the signal to send to each matched process.  Either 
             the numeric or the symbolic signal name can be used.  (pkill 
             only.)

有關更多資訊,請參見手冊頁。pkill

尋找過程

如果您發現您不再知道某個程序的程序 ID (PID),您可以通過多種方式找到它。

pgrep

您可以使用pgrep按名稱查找程序。

$ pgrep dispatcher.sh
12345

然後,您可以執行kill -8 12345.

ps

大多數人學會了使用ps. 您可以像這樣在輸出中查找您的程序。

$ ps -eaf | grep [d]ispatcher.sh
saml      2735     1  0 Jan11 ?        00:02:50 dispatcher.sh

PID 是輸出中的第二列(通常)。上面我包裝我正在尋找的過程的第一個字母的技巧消除grep了結果中的出現。不帶方括號試試看我的意思。

引用自:https://unix.stackexchange.com/questions/109077