nohup
の目的を知りたい 最近 。
これを読んだのでお願いします
Nohupは「NoHangups」の略です。単独で実行するコマンドではありません。 Nohupは、Linuxシステムが開始した後に別のコマンドを停止しないように指示する補足コマンドです。つまり、起動したユーザーがログアウトしても、完了するまで実行を継続します。 nohupの構文は単純で、次のようになります。
nohup sh your-script.sh&
コマンドの最後にある「&」に注意してください。これにより、コマンドがバックグラウンドに移動し、作業中の端末が解放されます。
Nohupは、ターミナルで実行するほぼすべてのコマンドで機能します。カスタムスクリプト、標準のシステムコマンド、コマンドラインユーティリティを使用して実行できます。
SLES11.4やRHEL/CentOS 7.xなどのLinuxディストリビューションを使用すると、次のことができます
- SSH経由でネットワーク経由でLinuxにリモートログイン
-
./a.out &
を実行して、以下の簡単なプログラムまたはその他のプログラムを実行します - Linuxからログアウトします。パテSSHターミナルでexitと入力します
- 以下のサンプルプログラム、またはbash、csh、tcshシェルスクリプトを含むその他のプログラムは、
nohup
を必要とせずに正常に実行されます。 - SSHセッションを閉じるためにputtyでexitと入力すると、ログアウトと見なされますか?
nouhup
に目的や価値はありますか 今日?それはカーネル>=3.xのものですか?覚えている限り(カーネル> =2.6)nohup
を使用したことはありません 常に&
を使用しています 問題ありません。
誰かがnohup
の実用的なシナリオを教えてもらえますか 使用されますか?
#include <stdlib.h>
#include <stdio.h>
/*
sample C code, to print numbers to a file named zz.tmp
the numbers 0 to 29 over 30 seconds
*/
int main ( int argc, char *argv[] )
{
FILE *fp;
int i;
i = 0;
fp = fopen("zz.tmp", "w" );
while ( i < 30 )
{
fprintf( fp, "%dn", i++ );
sleep( 1 );
}
fclose( fp );
return 0;
}
mysleep.sh
#!/bin/bash
sleep 1000
Centos 7.7、キーボードとマウスを使用したOptiPlex PCログインでは、私のアカウントはbashです。 nohup ./mysleep.sh
を実行します 次にcontrol-z 。 jobs
と入力する場合 [1]+ Stopped nohup ./mysleep.sh
が表示されます
ps -ef | grep mysleep
はそのプロセスIDが存在することを示していますが、右上隅のXを介してターミナルウィンドウを閉じると、そのプロセスが終了するため、nohup
のように見えます。 動作していませんか?
承認された回答:
SSH経由でネットワーク経由でLinuxにリモートログイン…Linuxからログアウトします。
exit
と入力します パテSSHターミナルで誰かが
nohup
の実用的なシナリオを教えてもらえますか 使用されますか?
もちろん。 exit
と入力する代わりに、シェルがbashであると仮定します(理由は以下を参照)。 または^D
、~.
と入力します 行の先頭で、sshクライアントが切断する原因になります :
$ ssh localhost
ssh$ sleep 3600 &
[1] 5765
ssh$ ~.
ssh$ Connection to localhost closed.
$ ps 5765
PID TTY STAT TIME COMMAND
sleep
の代わりにプログラムを使用できます; ~.
を介して切断する代わりに 、sshクライアントを強制終了するか、sshクライアントが実行されているマシンをクラッシュさせることができます。あなたはあなたのプロセスがこれを生き残ることを望みますか? nohup
を使用する 😉
接続を切断すると、もう一方の端を管理するサーバープロセスが終了し、カーネル(任意のUnix / Linuxカーネル)が作成した疑似端末sshを破棄し、SIGHUP
を送信します。 セッションリーダー(bashシェル)へのシグナル。bashマニュアルによると:
シェルは、
SIGHUP
を受信するとデフォルトで終了します 。終了する前に、
インタラクティブシェルがSIGHUP
を再送信します すべてのジョブに対して、実行中または
停止しました。停止したジョブはSIGCONT
に送信されますSIGHUP
を確実に受信するため 。
多くの人がこのbash機能を混同しています a) SIGCONT
のみを送信するカーネルによって実装された通常のジョブ制御 / SIGHUP
停止とペアリング 、実行中ではありません ジョブ[1]およびb) 別のbash機能(shopt -s huponexit
)ログインが発生します SIGHUP
を送信するbashシェル 正常に終了する場合でも(たとえば、exit
を介して)ジョブに移動します 。
[1]停止 jobは、停止したプロセスを少なくとも1つ含むジョブ(=プロセスグループ)です。 プロセス SIGTSTP
のようなシグナルのデフォルトアクションの効果として停止します 、SIGSTOP
、SIGTTIN
またはSIGTTOU
。 read
のようなブロッキングシステムコールで「スリープ」しているプロセス 、nanosleep
、select
、などは停止しているとは見なされませんが、実行中です。
なぜnohup
必ずしも役立つとは限りません
nohup
SIGHUP
の配置を設定するだけです 無視して一部のリダイレクトを行う場合、保証しません プロセスが他の方法で強制終了されないこと。
a) nohup ..
の場合 ジョブは停止されます 、インタラクティブなbashもSIGTERM
を送信します SIGHUP
だけでなく、シグナル / SIGCONT
ペア:
ジョブの停止中にbashを終了しようとすると、シェルは警告メッセージを出力します[…]コマンドを介さずに2回目の終了を試みた場合、シェルは別の警告を出力せず、停止したジョブは次のようになります。 終了 。
[終了 =SIGTERM
を送信しました 信号;これは別のksh/bash機能であり、すべてのシェルに存在するわけではありません]
これはすべて、ダブルフォークなどの簡単なトリックや、setsid(1)
を使用して新しいセッションを作成することで回避できます。 、しかし
b) systemd
(SIGTERM
を使用して)強制的に強制終了することにより、ログアウトしたセッションを「クリーンアップ」することもできます。 続いてSIGKILL
)KillUserProcesses
の場合、残りのプロセス 設定はオンです。これは一部のディストリビューションのデフォルトです。