GNU/Linux >> Linux の 問題 >  >> Linux

Nohupをいつ使用するのですか?

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-zjobsと入力する場合 [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を使用する 😉

関連:Debian –「ls」が突然一重引用符で囲まれたスペースでアイテムをラップするのはなぜですか?

接続を切断すると、もう一方の端を管理するサーバープロセスが終了し、カーネル(任意の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のようなシグナルのデフォルトアクションの効果として停止します 、SIGSTOPSIGTTIN またはSIGTTOUreadのようなブロッキングシステムコールで「スリープ」しているプロセス 、nanosleepselect 、などは停止しているとは見なされませんが、実行中です。

なぜnohup 必ずしも役立つとは限りません

nohup SIGHUPの配置を設定するだけです 無視して一部のリダイレクトを行う場合、保証しません プロセスが他の方法で強制終了されないこと。

a) nohup ..の場合 ジョブは停止されます 、インタラクティブなbashもSIGTERMを送信します SIGHUPだけでなく、シグナル / SIGCONT ペア:

ジョブの停止中にbashを終了しようとすると、シェルは警告メッセージを出力します[…]コマンドを介さずに2回目の終了を試みた場合、シェルは別の警告を出力せず、停止したジョブは次のようになります。 終了

[終了 =SIGTERMを送信しました 信号;これは別のksh/bash機能であり、すべてのシェルに存在するわけではありません]

これはすべて、ダブルフォークなどの簡単なトリックや、setsid(1)を使用して新しいセッションを作成することで回避できます。 、しかし

b) systemdSIGTERMを使用して)強制的に強制終了することにより、ログアウトしたセッションを「クリーンアップ」することもできます。 続いてSIGKILLKillUserProcessesの場合、残りのプロセス 設定はオンです。これは一部のディストリビューションのデフォルトです。


Linux
  1. SSH を使用してデスクトップでアプリケーションを開く

  2. 使用していないときにposix共有メモリを削除しますか?

  3. SSH 経由でデバイスを使用しますか?

  1. Ssh – Ssh / scp / sftpユーザーをディレクトリに制限しますか?

  2. ディレクトリで末尾のスラッシュを使用する必要があるのはいつですか?

  3. cd 使用時の / の使用

  1. いつ、なぜApt-get Updateを使用する必要がありますか?

  2. 専用サーバーを使用する場合

  3. いつ Bash を使用し、いつ Perl/Python/Ruby を使用するか?