5

バックグラウンドプロセスを開始するスクリプトがあります。

#!/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を使用していますが、ユーティリティの選択肢は限られています。

4

2 に答える 2

5

プロセス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対応するスクリプトが終了した後、ファイルが削除されることを確認してください。

于 2012-10-10T09:08:50.243 に答える
1

killコマンドpidが空であるため失敗したため。

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

これはあなたが望むpidをあなたに与えません。バックグラウンドでプロセスを開始すると、そのプロセスは新しいシェルで実行され、process.sh出力に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

于 2012-10-10T09:07:38.807 に答える