nohupで実行されたコマンドは、パテ端末が閉じられるとすぐに強制終了されます


1

Amazon ubuntu ec2インスタンスがあります

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

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

nohup mysqldump -uユーザー名-ppassword mydatabase | gzip> mydatabase.sql.gz

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

また、&で実行してみました

すなわち、nohup mysqldump -u username -ppassword mydatabase | gzip> mydatabase.sql.gz&

これらすべての日、それはうまく働いていました。しかし、突然それは奇妙に振る舞います。

誰も私を助けることができますか?


ほかのすべてを書くnohupと、&スクリプトでとしてスクリプトを起動nohupして&。たぶん、パテを閉じるとgzipが終了します。スクリプトの完全なコマンドの書き込みが失敗する場合-教えてください。
mnmnc

回答:


2

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

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


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

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

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

新たに生成されたシェルは、コマンドpipelineを呼び出し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 &

$ 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' &

Zackに感謝します。シェルスクリプトは動作します。(シェルを追加せずに)私のスクリプトが以前に動作していた理由についてのアイデアはすべて、突然失敗します。とにかく、あなたのソリューションに感謝します:)
スゴッシュ

可能性の1つは、データベースが時間とともに成長し、最初にmysqldump | gzipシェルを終了する前にパイプラインが終了したことです。後で、終了したときにコマンドがまだ実行されていたため、強制終了gzipされてmysqldumpを受け取りますSIGPIPE
zackse
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.