2012-10-10 63 views
4

我有一個啓動後臺進程的腳本。在shell腳本中查殺背景過程

#!/bin/sh 

./process1.sh & 
./process2.sh & 

我需要使用單獨的腳本來終止這些進程。 這裏是我做過什麼:

#!/bin/sh 
# the kill.sh 

pid=$(ps | grep './process1.sh' |grep -v grep| awk '{print $1}') 
kill -9 $pid 

提問時間:

  1. 當kill.sh被稱爲進程採空。但我收到消息

    「sh:你需要指定要殺人的人」。 這是爲什麼?

  2. 在我使用描述的腳本終止進程之後,它不會立即停止。一段時間後,我在屏幕上看到輸出,就好像進程仍在運行一樣。任何想法爲什麼?

  3. 什麼可能是殺死進程的替代解決方案?

值得一提的是,我正在與busybox合作嗎?我的工具選擇有限。

任何幫助,將不勝感激。

+0

當然,取決於你如何編寫這些腳本,但是你應該允許它們捕捉信號(執行kill時)並執行所需的操作來清理 - 或者優雅地關閉。 此外,只需在後臺啓動進程時將PID記錄爲/ tmp目錄中的臨時文件,不需要混淆'ps'命令。 – Anders

回答

4

你可以存儲進程ID在這樣的臨時文件:

#!/bin/sh 

./process1.sh & 
echo $! > /tmp/process1.pid 
./process2.sh & 
echo $! > /tmp/process2.pid 

,然後用你的腳本刪除。 $!返回上次執行的進程的PID。

kill -9 `cat /tmp/process*.pid` 
rm /tmp/process*.pid 

確保process*.pid文件在相應的腳本完成後被刪除。

+0

謝謝!似乎是由我工作 –

1

因爲kill命令失敗,因爲pid爲空。

pid=$(ps | grep './process1.sh' |grep -v grep| awk '{print $1}') 

這不會給你你想要的pid。當你在後臺啓動一個進程時,它會在一個新的shell中執行,並且你不會看到'process.sh in your ps`輸出。

你可以做的是保存的PID當您啓動後臺進程和殺死他們:

./process1.sh & 
pid1=$! # Save the previously started background's PID 
./process2.sh & 
pid2=$! # Save the previously started background's PID 

echo $pid1 " " $pid2 > /tmp/killfile 

然後從這個文件中獲得的PID,並把它傳遞給kill

+0

謝謝你的建議,我會嘗試一下。一個問題。這很奇怪,你告訴我,我的PID應該是空的,但事實並非如此。我已經測試了它,並且它保存了我想要殺死的進程的PID,並且我在ps列表中看到了該進程。 –

+0

運行'ps'沒有任何選項,因爲你不會顯示所有的進程。你可以在控制檯上運行ps並查看你的程序嗎? –

+0

是的,我只能用ps看到它們。我認爲這是busybox行爲的原因。 –