バックグラウンドで実行されているbashシェルスクリプトを終了する


16

多くの場合、bashシェルスクリプトを使用して、さまざまなファイルに対して簡単なコマンドを実行します。例えば、私は次があるとbash呼ばれるシェルスクリプト、script.shプログラム/コマンドを実行し、foo3つのテキストファイルには"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対応する"b.txt"が呼び出されると、その呼び出しも終了する必要があります。forループで指定された数十または数百のテキストファイルの場合、すべてfooを1つずつ終了するのは面倒です!そのため、代わりにシェルスクリプトから発行された特定の呼び出しではなく、シェルスクリプト自体を代わりに終了する必要があります。

コマンドを入力するとき

ps -u myusername

myusernameユーザー名はどこにあるのか、実行中のプロセスのリストを取得します。しかし、という2つの異なるプロセスIDが表示されbashます。これらのプロセスがあれば、どのプロセスが元の呼び出しに対応しているかを知るにはどうすればよいnohup bash script.sh &ですか?


@Andrew、両方のプロセスはコマンドで言及されたnohupを示していますか?....あるいは、ps -aWu Andrewを試して、nohupで単一の長いエントリを見つけることができるかどうかを確認できます。
ニティン

2
余談ですが、引用は奇抜です。for s in a b c; do foo "$s".txt; done
トリプリー

1
@NSD:いいえ、nohup開始したジョブを確認するためにプロセスリストを表示するまでには、もうなくなっています。ps出力の"niceness"列を見ることができますが、ここでの回答はより便利です。
トリプリー

回答:


9

デフォルトでpsは、プログラムが呼び出されたパラメーターは表示されません。オプション-f-l両方に完全な通話が表示されます。

ps -fu username

結果は次のようになります。

username 23464 66.7  0.0  11400   628 pts/5    R    15:28   1:40 bash script.sh

2
これは中程度に役立ちますが、同じ引数を持つ複数のプロセスを明確にしません。
トリプリー

11

いくつかのオプションがあります。プロセスはバックグラウンドで実行されているため、それを使用jobsして見つけることができます。

nohup bash script.sh &
...
jobs
[1]+ Running    nohup bash script.sh &
kill %1
jobs
[1]+ Terminated nohup bash script.sh &

またpkill、コマンドラインの一致についてプロセステーブルを検索することもできます。viz:

pkill -f script.sh

1

ps(例えばとの出力はps aux)親のプロセスIDが含まれます。parentをbash強制終了すると、その子も終了します。

プロセスツリーをASCIIで視覚化するにはpstree -p、いくつかのバックグラウンドプロセスを実行してみてください。

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