多くの場合、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 &
_に対応しているかをどのようにして知ることができますか?
デフォルトでは、ps
はプログラムの呼び出しに使用されたパラメーターを表示しません。オプション-f
および-l
両方とも完全な通話を表示します。
ps -fu username
結果は次のようになります。
username 23464 66.7 0.0 11400 628 pts/5 R 15:28 1:40 bash script.sh
いくつかのオプションがあります。プロセスはバックグラウンドで実行されているため、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
ps
出力(例:ps aux
)親のプロセスIDを含めます。親bash
を殺すと、その子も終了します。
ASCIIプロセスツリーの視覚化については、pstree -p
いくつかのバックグラウンドプロセスが実行されています。