おそらくお分かりのように、これを行う方法はたくさんあります。
「UPDATE#2」について-一般的に言えば、親子階層のプロセスを終了すると、通常、関連するすべてのプロセスが終了します。しかし、これには多くの例外があります。理想的には、プロセスツリーの最後の「子」を終了したい場合、他に実行するタスクがない場合、この子の親は終了する必要があります。しかし、親を殺した場合、親が死んだときにシグナルが子に中継され、子も終了する必要があります。ただし、子プロセスが(トラップまたは同様のメカニズムを介して)シグナルを無視して続行する場合があります。を実行するには、「init」プロセス(または同様のプロセス)が継承します。ただし、このプロセス動作の対象は複雑になる可能性があるため、そのままにしておきます...
制御スクリプト(次で説明)を使用したくない場合に好む方法の1つは、「screen」ユーティリティを使用してプロセスを開始および管理することです。'screen'コマンドは機能が豊富で、習得に時間がかかる場合があります。完全な説明については、「screen」のマニュアルページを読むことをお勧めします。バックグラウンドでプロセスを開始する簡単な例は、次のコマンドです。
screen -d -m / path / to / program
これにより、「画面」セッション内で「/ path / to / program」が開始されます。
次のコマンドで実行中のセッションを確認できます。
screen -ls
また、次のコマンドでいつでも実行中のプログラムに再接続できます。
画面-r
そして、それを^ Cなどで終了します。
プロセスから自由に再接続および切断できることの美しさに加えて、 'screen'はプログラムが生成する可能性のあるstdout()をキャプチャすることです。
しかし、これらの問題における私の個人的な好みは、プロセスの開始と停止を管理する制御プログラムを持つことです。これは多少複雑になり、間違いなく複雑なスクリプトが必要になります。そして、他のスクリプトと同様に、それを行うには数十の良い方法があります。アプリケーションの起動と停止に日常的に使用する方法のbashの例を含めました。タスクが単純な場合は、制御スクリプトに直接挿入するか、この制御スクリプトで別の外部プログラムを呼び出すことができます。この例は、プロセスの管理に関して決して包括的なものではないことに注意してください。「開始」オプションを使用するときにスクリプトがまだ実行されていないことを確認し、実行中のPIDが実際に開始したプロセスであることを検証します(たとえば、スクリプトが tが終了し、同じPIDを使用して別のプロセスが開始された)、最初の「kill」要求でスクリプトが実際に応答(終了)したことを検証しています。これらすべてのチェックを行うと複雑になる可能性があるため、この例を長く複雑にしたくありませんでした。シェルスクリプトを練習するために、例を変更することができます。
次のコードを「programctl」というファイルに保存し、次のコマンドで実行可能にします。
chmod 755 programctl
次に、ファイルを編集し、「myscript」で始まるケースセクションにコード/スクリプトを追加します。
すべてが整ったら、「programctl」が現在のディレクトリにあると想定して、次のコマンドでプログラムを開始できます。
./programctl start
そしてそれを止める:
./programctl stop
乾杯。
#!/bin/bash
# Description: A wrapper script used to stop/start another script.
#--------------------------------------
# Define Global Environment Settings:
#--------------------------------------
# Name and location of a persistent PID file
PIDFILE="/tmp/tmpfile-$LOGNAME.txt"
#--------------------------------------
# Check command line option and run...
# Note that "myscript" should not
# provided by the user.
#--------------------------------------
case $1
in
myscript)
# This is where your script would go.
# If this is a routine 'bash' shell script, you can enter
# the script below as illustrated in the example.
# Or you could simply provide the path and parameters
# to another script such as /dir/name/command -options
# Example of an embedded script:
while true
do
# do something over and over...
sleep 1
done
# Example of an external script:
/usr/local/bin/longrun -x
;;
start)
# Start your script in the background.
# (Note that this is a recursive call to the wrapper
# itself that effectively runs your script located above.)
$0 myscript &
# Save the backgound job process number into a file.
jobs -p > $PIDFILE
# Disconnect the job from this shell.
# (Note that 'disown' command is only in the 'bash' shell.)
disown %1
# Print a message indicating the script has been started
echo "Script has been started..."
;;
stop)
# Read the process number into the variable called PID
read PID < $PIDFILE
# Remove the PIDFILE
rm -f $PIDFILE
# Send a 'terminate' signal to process
kill $PID
# Print a message indicating the script has been stopped
echo "Script has been stopped..."
;;
*)
# Print a "usage" message in case no arguments are supplied
echo "Usage: $0 start | stop"
;;
esac