Shell
終止在後台執行的 bash shell 腳本
我經常使用
bash
shell 腳本為許多不同的文件執行簡單的命令。例如,假設我有以下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