linux nohup コマンドの使用法の詳細
取得元 http://www.happydown.com/info/21972.htm
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アップロードとダウンロードを可能にするので、これらのコマンドを使ってバックグラウンドでファイルのアップロードとダウンロードができるようになりました。
<スパン
==============================================================================================
Linuxコマンド nohup+screen
<スパン
ssh接続を閉じた後、起動したばかりのプログラムを引き続き実行したい場合はどうすればよいでしょうか。しかし、次の日になったとき、一度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が開いていても、デーモンが、sshを閉じても動作に影響がないのはなぜですか?
特殊なプログラムなので、例えばこれを実行した後にhttpd -k startすると、sshdのプロセスグループには入らず、別のプロセスグループになるので、sshが終了しても関係ない!ということになります。
[root@CentOS5-4 ~]# pstree |grep http
|httpd
[root@CentOS5-4 ~]# pstree |grep top
|-sshd-+-sshd---bash---top
<スパン
結論から言うと デーモン起動コマンド自体は特殊で、mysqld_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 ファイルに置かれます
& を付けても付けなくても、コマンドに影響はなく、プログラムをフォアグラウンドまたはバックグラウンドで実行させるだけです。
<スパン
第2画面
<スパン
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と同じですが、接続できないセッションを削除します。
関連
-
SSHパスワードフリーログイン設定後、stdinがターミナルでないため、疑似ターミナルが割り当てられない。
-
undefinedmakefile:n: *** セパレータがありません。
-
LDAPエラー ldap_bind: 無効な認証情報 (49) 解決策
-
gdbが実行可能なファイル形式でない ファイル形式が認識できない
-
PackagesNotFoundError: 以下のパッケージは、現在のチャネルから利用できません。
-
Ubuntu 18.04をインストールしたらどうする! 充実の詳細チュートリアル!
-
ubuntuでグローバルシステムエージェントを設定する
-
エラーとなったシェルスクリプトを実行します。"予期しないトークン付近の構文エラーに対する解決策`"
-
centos - centos7でcrontabを使用してmysqlのスケジュールバックアップを行う。
-
Ansibleの通常ユーザーsudoがコマンドを実行します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Makefileを参照してください。***セパレータがない。 停止 原因と解決策
-
[シェルプログラミング】シェルスクリプトの実行エラー: シンタックスエラー: 予期せぬファイルの終了
-
[turn] makeが表示される ターゲットが指定されておらず、makefileが見つからない 解決方法
-
セキュアネットワーク(sshポートマッピング) -----図の詳細を使用することができます。
-
linux リモートコピーコマンドと通常のファイルソリューションではありません。
-
LinuxでDNSの正逆解析エラー:** server can't find ?・・・・・・? : NXDOMAIN
-
cp: 通常のファイル `/usr/local/bin/orange' を作成できません。テキストファイルがビジー状態
-
'float' オブジェクトは整数として解釈できません。
-
pow関数に対する解決策 gcc compile prompt undefined reference to `power'
-
pip: コマンドが見つかりません