スクリプトを終了せずに同じスクリプトで開始されたバックグラウンドプロセスを停止する方法は?

スクリプトを終了せずに同じスクリプトで開始されたバックグラウンドプロセスを停止する方法は?

可変時間(2分以内)で実行されるプログラムがあり、あまり迷惑にならないように幸運なメッセージを追加しました。

 #!/bin/bash
 ...
 for i in $(seq 1 45); do sleep 3; echo; echo; fortune; done &
 ...

しかし、プログラムの持続時間は(ここでは関連していない要因によって)変わる可能性があり、停止メッセージが必要です。

 #!/bin/bash
 ...
 for i in $(seq 1 45); do sleep 3; echo; echo; fortune; done &
 ...
 if [any-condition]; Then
      #script is over... Stop messages!!!
 fi
 ...
 if [any-condition]; Then
      #Stop messages... script continue execution
 fi
 ... Blah blah
 ...
 #script is over stop Messages!

そのため、3秒間に45個のメッセージを準備すると、プログラムはすぐに終了することができますが、端末にはまだメッセージが表示され、他の作業が妨げられます。

コマンドを試しましたが、jobsバックグラウンドには何もありません。コマンドを試しましたが、psメッセージ操作が見つかりませんでした。

この幸運のメッセージをどのように防ぐことができますか?

ベストアンサー1

最も簡単な方法はを使用することです$!。これはバックグラウンドで開始された最後のプロセスのPIDですman bash

非同期コマンドとして実行されるか、bg組み込みコマンドを使用して、最近バックグラウンドに追加されたジョブのプロセスIDに展開されます。

したがって、次のようにすることができます。

for i in $(seq 1 45); do sleep 3; echo; echo; fortune; done &
pid=$!

[ main script here]

if [any-condition]; then
  kill $pid
fi

しかし、私はこれが仕事をするやや複雑な方法だとは思わないかもしれません。完全なスクリプトを表示すると、より具体的な例を提示できますが、次のようなことはなぜできませんか?

long_process &
while ps -p $! >/dev/null; do sleep 3; echo; echo; fortune; done 

これにより、時間がかかり、fortune終了するまで実行されるすべてのプロセスを開始できます。

おすすめ記事