it-swarm-ja.com

Nohupで実行されたコマンドは、PuTTYターミナルが閉じられるとすぐに強制終了されます

Amazon ubuntuec2インスタンスがあります

私はPuTTYを使用して同じものにアクセスしています。

ここでは、mysqlに大規模なデータベースがあります。次のコマンドを実行して、データベースのバックアップを取ります。

Nohup mysqldump -u username -ppassword mydatabase | gzip> mydatabase.sql.gz

これで、PuTTYを終了すると、コマンドがバックグラウンドで実行されなくなりました。

&で走ってみました

つまり、Nohup mysqldump -u username -ppassword mydatabase | gzip> mydatabase.sql.gz&

最近はずっとうまくいっていました。しかし、突然、それは奇妙な振る舞いをします。

誰か助けてもらえますか?

1
Sughosh

コマンドが呼び出される前にシェルが|>などのメタ文字を解釈するため、Nohupへの引数はパイプ記号の前で終了します。

提供されるコマンドラインは、Nohupの標準出力(mysqldumpではない)をgzipの標準入力に転送します。したがって、ログアウトすると、シェルと子プロセスはハングアップ信号を受信します。 Nohupは信号がmysqldumpコマンドに到達するのを防ぎますが、gzipコマンドは、終了時に閉じられている制御端末にまだ接続されているため、強制終了されます。セッション。


mnmncが示唆するようにコマンドをスクリプトに入れるか、新しいシェルを呼び出してパイプライン全体を実行できます。

Nohup sh -c 'mysqldump -u user -ppass db | gzip > db.sql.gz' &

ここで、Nohupは単一のコマンドshを呼び出します。その標準出力はデフォルトでファイルNohup.outに送信されますが、mysqldumpの標準出力をリダイレクトするため、このコマンドからの出力は期待できません。

新しく生成されたシェルは、コマンドパイプラインmysqldump | gzipを呼び出し、gzipの標準出力を指定されたファイルにリダイレクトします。

ここで、呼び出されるコマンドの違いを確認できます(これらの例では、ddの代わりにmysqldumpを使用しています)。

$ Nohup dd if=/dev/urandom bs=1M count=50 | gzip > /tmp/out.gz &
[1] 10721
Nohup: ignoring input and redirecting stderr to stdout

$ jobs
[1]  10720 Running                 Nohup dd if=/dev/urandom bs=1M count=50
     10721                       | gzip > /tmp/out.gz &

vs.

$ Nohup sh -c 'dd if=/dev/urandom bs=1M count=50 | gzip > /tmp/out.gz' &
[1] 10792
Nohup: ignoring input and appending output to ‘Nohup.out’

$ jobs
[1]  10792 Running                 Nohup sh -c 'dd if=/dev/urandom bs=1M count=50 | gzip > /tmp/out.gz' &
2
zackse