Shell

終止在後台執行的 bash shell 腳本

  • June 15, 2013

我經常使用bashshell 腳本為許多不同的文件執行簡單的命令。例如,假設我有以下bash名為 的 shell 腳本,它在三個文本文件、、上script.sh執行程序/命令:foo``"a.txt"``"b.txt"``"c.txt"

#!/bin/bash

for strname in "a" "b" "c"
do
foo $strname".txt"
done

此外,假設這foo $strname".txt"很慢,因此腳本的執行將需要很長時間(例如,數小時或數天)。因此,我想使用nohup以便即使終端關閉或斷開連接也能繼續執行。我還希望腳本立即進入後台,所以我將使用&操作符。因此,我將使用以下命令來呼叫script.sh

nohup bash script.sh &

這適用於在後台執行腳本並且沒有掛斷,但現在假設我想出於某種原因在某個時候終止執行。我怎樣才能做到這一點?

我遇到的問題是,通過查看top,我只看到foo對應的"a.txt"。我可以終止該foo呼叫,但隨後呼叫foo對應的 to "b.txt",然後我也必須終止該呼叫,依此類推。對於循環中指定的數十或數百個文本文件,逐個for終止變得很痛苦!foo所以我需要以某種方式終止 shell 腳本本身,而不是從 shell 腳本發出的特定呼叫。

當我輸入命令時

ps -u myusername

我的使用者名在哪裡myusername,我得到了我正在執行的程序列表。但我看到兩個不同的程序 ID 稱為bash. 我怎麼知道這些過程中的哪一個(如果有)對應於我的原始呼叫nohup bash script.sh &

預設情況下,ps不會顯示呼叫程序的參數。選項-f-l兩者都將顯示完整的通話。

ps -fu username

將產生如下所示的輸出:

username 23464 66.7  0.0  11400   628 pts/5    R    15:28   1:40 bash script.sh

你有幾個選擇。由於您的程序在後台執行,您可以使用jobs它來查找它:

nohup bash script.sh &
...
jobs
[1]+ Running    nohup bash script.sh &
kill %1
jobs
[1]+ Terminated nohup bash script.sh &

您還可以使用pkill在程序表中搜尋命令行匹配;即:

pkill -f script.sh

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