2

リモート Linux サーバーで非同期プログラムを無期限に実行したいと考えています。このスクリプトは、サーバー自体に何も出力しません (mysql データベースに時折情報を書き込むことを除いて)。これまでのところ、私が見つけることができた唯一のオプションは nohup コマンドです。

nohup script_name &

私が理解していることから、「&」文字を使用するとコマンドをバックグラウンドで実行できますが、nohup を使用すると、SSH セッションからログアウトした後でもコマンドを実行できます。私の質問は簡単です: これは私がやりたいことをするための最良の方法ですか? 更新を行うために時々停止しながら、単一のスクリプトを長期間実行しようとしています。

また、nohup が実際に最適なオプションである場合、必要なときにスクリプトを終了する適切な方法は何ですか? nohup プロセスを強制終了する最善の方法については、意見の相違があるようです。

ありがとう

4

4 に答える 4

3

基本的に質問しているのは、「デーモンプロセスを作成するにはどうすればよいですか?」ということです。あなたがしたいのは「デーモン化」です。これの多くの例がウェブ上に浮かんでいます。プロセスは基本的fork()に、子が新しいセッションを作成し、親が終了し、子が複製してから、開いているファイルハンドルを制御端末 (STDIN、STDOUT、STDERR) に閉じます。

python-daemonと呼ばれるこれらすべてを実行するパッケージが利用可能です。

正常なシャットダウンを実行するには、シグナル ハンドラを作成するためのシグナル ライブラリを参照してください。

また、Web で「python daemon」を検索すると、一般的な C デーモン化プロセスの多くの再実装が表示されます: http://code.activestate.com/recipes/66012/

于 2009-12-18T18:49:14.257 に答える
2

スクリプトを変更できる場合は、SIGHUPシグナルをキャッチして の必要性を回避できますnohup。bash スクリプトでは、次のように記述します。

trap " echo ignoring hup; " SIGHUP

同じ手法を使用してプログラムを終了できます。たとえば、ハンドラーで SIGUSR1 シグナルをキャッチし、フラグを設定してから、メイン ループを正常に終了します。このようにして、選択したこの信号を送信して、プログラムを予測可能な方法で停止できます。

于 2009-12-18T09:34:44.523 に答える
1

リモート マシン/サーバー上でいくつかのスクリプトを実行/開始し (自動的に終了します)、サーバーから切断したい場合があります。

例: ボックスで実行されるスクリプトは、実行時に 1) モデルを受け取り、それを顧客 (リモート サーバー) にコピーします。2) wodel でシミュレーションを実行するためのスクリプトを作成し、それをサーバーにプッシュします。3) スクリプトをサーバーと切断 4) このように開始されたスクリプトの役割は、サーバーでシミュレーションを実行し、完了すると (完了するまでに数日かかります)、結果をクライアントにコピーすることです。

次のコマンドを使用します。

ssh remoteserver 'nohup /path/to/script `</dev/null` >nohup.out 2>&1 &'

例えば:

echo '#!/bin/bash  
rm -rf statuslist  
mkdir statuslist  
chmod u+x ~/monitor/concat.sh  
chmod u+x ~/monitor/script.sh  
nohup ./monitor/concat.sh &  
' > script.sh 

chmod u+x script.sh

rsync -azvp script.sh remotehost:/tmp

ssh remoteshot '/tmp/script.sh `</dev/null` >nohup.out 2>&1 &'

お役に立てれば ;-)

于 2010-02-17T13:18:18.213 に答える
0

スクリプト自体の変更を避けたい (または避けなければならない) 場合は、これが最も簡単な方法です。スクリプトが常にこのように実行される場合は、入力した行を含むミニ スクリプトを作成し、代わりにそれを実行できます。(または、必要に応じてエイリアスを使用)

2番目の質問に答えるには:

 $ nohup ./test &
[3] 11789
 $ Sending output to nohup.out

$jobs
[1]-  Running                 emacs *h &
[3]+  Running                 nohup ./test &
$ kill %3
$ jobs
[1]-  Running                 emacs *h &
[3]+  Exit 143                nohup ./test

Ctrl+c も機能します (SIGINT を送信します)、kill も同様です (SIGTERM を送信します)

于 2009-12-18T09:25:14.847 に答える