web-dev-qa-db-ja.com

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

多くの場合、bashシェルスクリプトを使用して、さまざまなファイルに対して単純なコマンドを実行します。たとえば、次のbashシェルスクリプト(_script.sh_)があり、3つのテキストファイルに対してプログラム/コマンドfooを実行するとします_"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を見ると、_"a.txt"_に対応するfooだけが表示されていることです。そのfoo呼び出しを終了できますが、_"b.txt"_に対応するfooが呼び出され、その呼び出しも終了する必要があります。 forループで指定された数十または数百のテキストファイルの場合、fooを1つずつ終了するのは面倒です。したがって、どういうわけか、代わりにシェルスクリプトから発行されたparticular呼び出しではなく、シェルスクリプトitselfを終了する必要があります。

コマンドを入力すると

_ps -u myusername
_

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

16
Andrew

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

ps -fu username

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

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

いくつかのオプションがあります。プロセスはバックグラウンドで実行されているため、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
11
JRFerguson

ps出力(例:ps aux)親のプロセスIDを含めます。親bashを殺すと、その子も終了します。

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

1
tripleee