質問: 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&最近はずっとうまくいっていました。しかし、突然、それは奇妙な振る舞いをします。誰か助けてもらえますか?
回答: コマンドが呼び出される前にシェルが|や>などのメタ文字を解釈するため、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' &