Bashスクリプトは、起動した別のスクリプトのインスタンスのみを強制終了する必要があります


11

現在の状況では、特定のスクリプト「calling.sh」がバックグラウンドで別のスクリプト「called.sh」を起動し、他の操作を実行し、しばらくの間スリープし、その後「called.sh」をで終了しますpkill called.sh。これは正常に機能します。

次に、calling.shを起動する前でも後でも他の端末からスタンドアロンのスクリプトとして「called.sh」を起動します。これらの独立したインスタンス、「calling.sh」によって強制終了されるべきではありません

どうすればこれを達成できますか?直観によると、呼び出し元のスクリプトは、その間に実行されている他の名前の由来から開始したプロセスを伝えることができるはずです。

変種として、「calling.sh」は「called.sh」へのシンボリックリンクである「called」を起動することもあります。これは上記の状況の管理を複雑にしますか?シンボリックリンクを使用するには、どのような注意と調整が必要ですか。


回答:


27

それを殺すために名前を使用しないでください。以来calling.sh、スクリプトがあなたが後で殺したいプロセスを呼び出しているだけ使用$!(からman bash):

! 非同期コマンドとして実行された場合でも、bg組み込みコマンドを使用した場合でも、最後にバックグラウンドに配置されたジョブのプロセスIDに展開されます

だから、あなたがcalling.shこのような場合:

called.sh &
## do stuff
pkill called.sh

これに変更します。

called.sh &
calledPid=$!
# do stuff
kill "$calledPid"

4
これは、called.shが単独で終了しない限り機能します。そうしないと、そのpidが再利用され、結果として無害で無関係なプロセスが強制終了される可能性があります。
Eugene Ryabtsev

2
@EugeneRyabtsevそれは非常に良い点です。$calledPidの親PIDがのPIDであることも確認できると思いますcalled.sh
terdon

答えを強調するために、これは私の考えを整理するのに役立つ別のリソースです:mywiki.wooledge.org/ProcessManagement
XavierStuvw

18

私はこれを選択する必要がありましたが、スクリプトから何度も選択しました。スクリプトが複雑な自動スケジュールの一部として呼び出されると、さらに楽しいです。強制終了pkillするスクリプトを選択するようなものに依存するべきではありません。

Calling.shの内部では、開始したジョブのPIDを記録し、PIDで明示的にそれらを強制終了する必要があります。

Calling.shの内部:

./called.sh &
called_pid=$!

# Later
kill $called_pid
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.