1. ホーム
  2. Qt

linux 24, バックグラウンド処理 nohup コマンド

2022-02-09 02:31:48

nohupコマンド+ &コマンドを使用すると、プログラムをバックグラウンドで実行できるため、xshellを使用してサーバーに接続している場合、xshellが切断されてもプログラムを実行することができます

nohupは、プログラムをバックグラウンドで実行するために使用されるシャットダウン信号、&の影響を受けません。

具体的な実行コマンドは:

nohup あなたのコマンド&amp。

元のアドレス:http://www.dedecms.com/knowledge/servers/linux-bsd/2012/0822/12830.html

uwun @uwunssh が Linux に接続し、接続を終了してもバックグラウンドでプログラムを実行したい場合 nohup コマンドを使用することができます。
nohup /opt/phpfpm/bin/php hotel.php &
nohup.outへの追加出力は正しく表示されます。
ps -ef でプロセスの pid を見ることができます。
プロセスを終了させるには、そのpidをkillします。
<スパン
<スパン

Unix/Linuxでは一般的に、例えばプログラムをバックグラウンドで実行させたい場合、多くはプログラムの最後に&を使ってプログラムを自動的に実行させます。例えば、mysqlをバックグラウンドで実行させたい場合。
/usr/local/mysql/bin/mysqld_safe --user=mysql &
しかし、私たちのプログラムの多くは、mysqldのようなデーモンにはなっていません。もしかしたら、私たちのプログラムは普通のプログラムかもしれませんが、そのようなプログラムでは通常&という末尾が使われますが、ターミナルを閉じるとプログラムも閉じられます。例えば、バックグラウンドで実行する必要があるtest.phpがあり、バックグラウンドで定期的に実行させたい場合、nohupを使用します: nohup
nohup /root/test.php &
<スパン   チップ
  [~]$ nohup.outに出力を追記する。
  さて、これで正常に実行されたことが証明され、プログラムの出力がカレントディレクトリの nohup.out ファイルに格納されます。
  添付ファイル:Nohupコマンドリファレンス
nohupコマンド
<スパン   目的 ハングアップせずにコマンドを実行します。
  Syntax: nohup Command [ Arg ... ] [ & ].
<スパン    説明 nohup コマンドは、Command 引数および関連する Arg 引数で指定されたコマンドを、ハングアップ (SIGHUP) シグナルをすべて無視して実行するコマンドです。ログオフ後にバックグラウンドでプログラムを実行するには、nohup コマンドを使用します。バックグラウンドで nohup コマンドを実行するには、コマンドの最後に & ("and" の記号) を追加してください。
   nohupコマンドの出力をターミナルにリダイレクトしてもしなくても、出力はカレントディレクトリのnohup.outファイルに追記されます。カレント・ディレクトリの nohup.out ファイルが書き込み可能でない場合、出力は $HOME/nohup.out ファイルにリダイレクトされます。追記用にファイルを作成または開くことができない場合、Commandパラメータで指定したコマンドは起動できません。標準エラーが端末である場合、指定されたコマンドによって標準エラーに書き込まれたすべての出力は、標準出力と同じファイル記述子にリダイレクトされます。
  終了ステータスです。このコマンドは、次の終了値を返します。
  126 Command パラメータで指定されたコマンドは見つかりましたが、起動されていません。
  127 nohupコマンドでエラーが発生したか、Commandパラメータで指定されたコマンドが見つかりませんでした。
  それ以外の場合、nohup コマンドの終了ステータスは Command パラメータで指定されたコマンドの終了ステータスになります。
nohupコマンドとその出力ファイル
  nohupコマンドです。プロセスを実行していて、アカウントを終了してもプロセスが終了しないと感じた場合、nohup コマンドを使用することができます。このコマンドを使うと、アカウントを終了した後/ターミナルを閉じた後も、プロセスの実行を継続できます。nohupは、ハングアップしない(n ohang up)という意味です。
このコマンドの一般的な形式は、nohup コマンド & です。
<スパン nohupコマンドを使ったジョブの投入
nohupコマンドを使用してジョブを投入すると、デフォルトでは、他の出力ファイルが指定されていない限り、ジョブからのすべての出力はnohup.outというファイルにリダイレクトされます。
nohup コマンド > myout.file 2>&1&
上記の例では、出力はmyout.fileファイルにリダイレクトされます。
<スパン タスクを表示するには、ジョブを使用します。
fg %n を使用して終了します。
また、ncftpgetとncftpputという一般的なftpツールがあり、バックグラウンドでのftpアップロードを可能にするので、これらのコマンドを使ってバックグラウンドでファイルのアップロードやダウンロードをすることができます。
<スパン 元の投稿アドレス:http://www.21andy.com/blog/20071121/677.html
<スパン
<スパン ==============================================================================================
<スパン コマンド nohup+screen
<スパン
<スパン しかし、次の日になったとき、一度sshを開けば、昨日実行したプログラムの状態を見ることができ、その後も作業を続けることができることを要求する場合、nohupは機能せず、その目的のためにscreenを使用する必要があります。
<スパン
<スパン 能書き
<スパン
<スパン 質問1 sshを終了すると、プログラムが停止してしまうのはなぜですか?
<スパン 犯人:SIGHUP信号
<スパン ウィンドウを閉じる/接続を切ることで、実行中のプログラムが死んでしまう理由を見てみましょう。
<スパン
Linux/Unixでは、次のようないくつかの概念があります。
プロセスグループ。1つ以上のプロセスの集まりで、それぞれが一意のプロセスグループID(プロセスグループリーダープロセスのID)を持っています。
セッション。1つまたは複数のプロセスグループの集まりで、一意のセッションリーダーを持つ。セッションIDは、最初のプロセスのIDである。
セッションは、個別の制御端末を持つことができます。制御端末に接続されたセッションの最初のプロセスを制御プロセスと呼びます。現在、端末とやり取りしているプロセスをフォアグラウンドプロセスグループと呼びます。それ以外のプロセスグループをバックグランドプロセスグループと呼びます。
POSIX.1 で定義されているとおり。
ハングアップ信号(SIGHUP)のデフォルトの動作は、プログラムの終了です。
端末インタフェースは、ネットワーク接続の切断を検出すると、制御プロセス(セッションヘッドプロセス)にハングアップ信号を送信する。
セッションヘッドプロセスが終了した場合、そのセッションのフォアグラウンドプロセスグループにシグナルが送られます。
プロセス終了によりオーファンドラッグのプロセスグループが発生した場合、オーファンドラッグのプロセスグループの中にSTOP状態のプロセスがあれば、そのプロセスグループ内の全てのプロセスにSIGHUP信号とSIGCONT信号を送信します。
<スパン 結論から言うと つまり、ネットワークが切断されたり、ターミナルウィンドウが閉じられたりすると、つまりSSHが切断されると、制御プロセスがSIGHUPシグナルを受けて終了し、そのセッション内の他のプロセスも終了してしまうのです。
<スパン
要するに、sshが開かれた後、bashなどは彼のサブルーチンであり、sshが閉じられると、システムは関連するすべてのプロセスを殺す!ということである。つまり、sshが閉じられると、進行中のタスクはキャンセルされます。
<スパン

<スパン 例を見てみましょう。SSHターミナルウィンドウを2つ開き、片方のウィンドウでtopコマンドを実行します。
[root@tivf09 root]# top
<スパン
別のターミナルウィンドウで、プロセス ID 5180 とその親プロセス ID 5128、ログインシェルの top を見つけます。
[root@tivf09 root]# ps -ef|grep top
ルート 5180 5128 0 01:03 pts/0 00:00:02 top
root 5857 3672 0 01:12 pts/2 00:00:00 grep top
<スパン
この関係は、pstreeコマンドを使うとより明確に見ることができる。
[root@tivf09 root]# pstree -H 5180|grep top
|-sshd-+-sshd---bash---top
<スパン
<スパン
ps-xjコマンドを使用すると、ログインシェル(PID 5128)とtopが同じセッション期間にあり、シェルはセッション期間の最初のプロセスでプロセスグループPGID 5128に、topはフォアグラウンドプロセスグループであるプロセスグループPGID 5180にあることが確認できます。
[root@tivf09 root]# ps -xj|grep 5128
 5126 5128 5128 5128 pts/0 5180 S 0 0:00 -bash
 5128 5180 5180 5128 pts/0 5180 S 0 0:50 top
 3672 18095 18094 3672 pts/2 18094 S 0 0:00 grep 5128
<スパン
最初のSSHウィンドウを閉じると、もう一つのウィンドウではtopもkillされていることがわかります。
[root@tivf09 root]# ps -ef|grep 5128
root 18699 3672 0 04:35 pts/2 00:00:00 grep 5128
<スパン
質問2 デーモンが開いていても、閉じていてもsshに影響がないのはなぜですか?
特殊なプログラムなので、例えばこれを実行した後にhttpd -k startすると、sshdのプロセスグループには入らず、別のプロセスグループになるので、sshが終了しても関係ない!ということになります。
[root@CentOS5-4 ~]# pstree |grep http
     |httpd
[root@CentOS5-4 ~]# pstree |grep top
     |-sshd-+-sshd---bash---top
<スパン
<スパン
<スパン 結論から言うと デーモン起動コマンド自体が特殊で、d_safeなどの一般的なコマンドとは異なる。 一度使用すると、デーモンが起動したことになる。そのため、通常のプログラムをデーモンに変換することはできない。
<スパン
<スパン 質問3 sshのプロセスグループ制御からプログラムを外すために、バックグラウンドのrunコマンド&を使うことはできますか?
テストをしてみましょう:find / -name '*http*'&
ctrl+dでログアウトした後、システムに戻ると、このコマンドが再び実行されているのが見えますか?
<スパン 答えは、「コマンドは中断されました」です。
<スパン
というのも、彼はまだこのsshプロセスグループに所属しているからです。
[root@CentOS5-4 ~]# pstree |grep find
     |-sshd-+-sshd---bash--find
<スパン
結論としては、sshがデーモンではなく一般コマンドで開いている限り、&の有無に関わらず、sshを閉じると、システムはSIGHUPで終了してしまいます。
<スパン
<スパン 質問4 nohupで解決できること
しかし、ログアウトしてもバックグラウンドで実行できるようにするために、nohup コマンドを使用して、find / -name '*http*'& を探し始めます。
で、バックグラウンドで実行したい。
次に、nohupを使用します: nohup find / -name "*httpd*"
デフォルトでは、プログラムの出力は現在のフォルダーにある nohup.out ファイルに置かれます
& を付けても付けなくても、コマンドに影響はなく、プログラムをフォアグラウンドまたはバックグラウンドで実行させるだけです。
<スパン
<スパン ツースクリーン
<スパン
nohupは使いやすいものの、比較的初歩的で、簡単なコマンドは扱えますが、人間とコンピュータの対話が必要な複雑なタスクは苦手です。
人気のある Linux ディストリビューション (Red Hat Enterprise Linux 4 など) には通常 screen ユーティリティが付属していますが、そうでない場合は GNU screen ウェブサイトからダウンロードすることができます。
<スパン
<スパン  1)使用方法
画面を実行し、いずれかのキーを押すと、サブ画面に入ります。
pingコマンドで実行を開始し、オフの時にsshを閉じてpingを続けたい場合は、ctrl+a、dの順に押します。これでサブスクリーンが一時停止し、[detached]と表示され、親画面に戻ります。
<スパン 子画面の現在の状態を見るには、screen -lsを使用します screen -ls
<スパン 画面に表示されています。22292.pts-3.free (切り離し)
1 /tmp/screens/S-rootにあるソケット、22292は実際にはサブインターフェイスのpid番号です。
<スパン
screen -r 22292でサブスクリーンに戻ると、pingのサブスクリーンにすぐ行けます。
<スパン
<スパン 2) その他のヘルプ
<スパン C-a (ctrl+a)? を使うと、すべてのキーバインディングを見ることができますが、一般的なものは次のとおりです。
<スパン
<スパン C-a ?
<スパン キーバインディング情報をすべて表示する
<スパン C-a w
<スパン すべてのウィンドウの一覧を表示する
<スパン C-a C-a
<スパン 前回表示したウィンドウに切り替える
<スパン C-a c
シェルを実行するための新しいウィンドウを作成し、そのウィンドウに切り替えます
<スパン C-a n
<スパン 次のウィンドウに切り替える
<スパン C-a p
<スパン 前のウィンドウに切り替える(C-a nとは異なります)
<スパン C-a 0...9
ウィンドウ0.9への切替
<スパン C-a a
C-aをカレントウィンドウに送信する
<スパン C-a d
画面セッションを一時的に切断する
<スパン C-a k
現在のウィンドウを消す
<スパン C-a [ ](英語
<スパン コピー/ロールバックモードに入る
<スパン
その他の一般的なオプション。
<スパン
-cファイル
デフォルトの$HOME/.screenrcの代わりに設定ファイルファイルを使用します。
-d|-D [pid.tty.host]を指定します。
新しい画面セッションを開く代わりに、実行中の他の画面セッションを切断する
-h 番号
履歴のロールバックバッファーのサイズをnum rowsで指定します。
-リスト|-ls
列は、pid.tty.hostのフォーマットでスクリーンセッションと一緒に表示されます。
<スパン -d -m
切断モードで開始するセッションの開始
-r セッションオーナー/ [pid.tty.host]。
切断されたセッションに再接続する。マルチユーザーモードで他のユーザー画面のセッションに接続するには、セッションオーナーを指定し、setuid-root権限が必要です
-S セッション名
画面セッションを作成する際にセッション名を指定する
-v
<スパン 画面のバージョン情報を表示する
<スパン -ワイプ [一致]
listと同じですが、接続できないセッションを削除します。