NOHUPを使用する場合

NOHUPを使用する場合

目的を知りたいです。nohup 最近では

この記事を読んだので尋ねます。

Nohupは「No Hangups」の略です。実行する別のコマンドではありません。 Nohup は、他のコマンドの起動後に Linux システムを停止しないように指示する補足コマンドです。つまり、起動したユーザーがログオフしても、完了するまで実行され続けます。 nohupの構文は簡単で、次のようになります。

nohup sh your-script.sh &

コマンドの最後にある「&」を参照してください。これにより、コマンドが背景に移動し、使用中の端末が解放されます。

Nohupは、端末で実行されるほとんどすべてのコマンドで動作します。標準のシステムコマンドとコマンドラインユーティリティだけでなく、カスタムスクリプトを使用して実行できます。

SLES 11.4やRHEL / CentOS 7.xなどのLinuxディストリビューションでは、次のことが可能です。

  • SSH経由でネットワーク経由でLinuxにリモートログイン
  • 以下の簡単なプログラム、または以下を実行する他のプログラムを実行してください。./a.out &
  • Linuxを終了し、putty SSH端末に終了を入力してください。
  • 以下のプログラム例、または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, "%d\n", i++ );
      sleep( 1 );
   }
   fclose( fp );
   return 0;
}

mysleep.sh

#!/bin/bash

sleep 1000

Centos 7.7、キーボードとマウスを使ったoptiplex PCログインでは、私のアカウントはbashです。私はこれをやっnohup ./mysleep.shてからコントロール-Z。入力しながらjobs見る[1]+ Stopped nohup ./mysleep.sh

Aはps -ef | grep mysleepプロセスIDが存在すると言いますが、右上のXでターミナルウィンドウを閉じるとプロセスが消えて動作しないようですnohup

ベストアンサー1

SSH経由でネットワーク経由でLinuxにリモートでログインします。 Linuxからログアウトし、exitputty SSH端末に入力します。

誰かが私に実際のnohup使用シナリオを提供できますか?

確かに。シェルがbashであると仮定した場合(下記の理由を参照)、またはexitを入力するのではなく行の先頭に入力すると、ssh^Dクライアント~.切断する:

$ ssh localhost
ssh$ sleep 3600 &
[1] 5765
ssh$ ~.
ssh$ Connection to localhost closed.
$ ps 5765
  PID TTY      STAT   TIME COMMAND

代わりにプログラムを使用できますsleep~.接続を切断する代わりに、SSHクライアントをシャットダウンしたり、実行しているコンピュータをクラッシュさせることができます。あなたのプロセスが生き残りたいですか?使用nohup;-)

切断すると、反対側のエンドを管理するサーバープロセスが終了し、カーネル(すべてのUnix / Linuxカーネル)がsshで生成された擬似端末を解体し、セッションリーダーSIGHUP(bashシェル)にシグナルを送信します。バッシュマニュアル:

SIGHUP対話型シェルは、終了する前にSIGHUP 実行中または停止したすべてのジョブを再送信します。停止したジョブを送信して受信したことをSIGCONT確認してください SIGHUP

多くの人がこれについて混乱しています。バッシュ機能そしてㅏ)カーネルによって実装された一般的なジョブ制御はSIGCONT/SIGHUPペアのみを送信します。停止、それほどではない走る職業[1]そして雨)別のbash関数(shopt -s huponexit)はログインSIGHUPexitbashシェルは正常に終了しても(例えばviaを介して)、そのアクションにaを送信します。

[1] 一つ停止ジョブは、1つ以上の停止したプロセスを含むジョブ(=プロセスグループ)です。 ㅏプロセスSIGTSTP信号のために停止しSIGSTOPたり、SIGTTIN信号を待つ基本動作ですSIGTTOU。ブロックシステムコール(たとえば、、など)で「休止」状態のプロセスは、停止しているとは見なされず、実行中と見なされreadますnanosleepselect

nohupいつも役に立たない理由

nohupSIGHUP無視していくつかのリダイレクトを実行するように処理を設定するだけです。保証しない他の方法ではプロセスを終了できません。

ㅏ)nohup ..職業停止、対話型bashは/ペアSIGTERMだけでなく信号も送信します。SIGHUPSIGCONT

ジョブの停止中にbashを終了しようとすると、[...]シェルは警告メッセージを表示します。 [...]中間コマンドなしで再び終了しようとすると、シェルは他の警告や停止したジョブを印刷しません。はい終了

[終了=SIGTERMシグナルを送信しました。これは別のksh / bash機能であり、すべてのシェルにはありません。]

これらはすべて、二重分岐や新しいセッションの作成などの簡単なトリックで解決できますがsetsid(1)

雨) systemdSIGTERMその設定がオンの場合は、SIGKILL残りのプロセスを強制終了して(後に)ログアウトしたセッションを「クリーンアップ」することもできますKillUserProcesses。これは一部のディストリビューションのデフォルトです。

おすすめ記事