Nohupコマンドの概要

6372 ワード

1つのコマンドをバックグラウンドで実行するには、nohup sh command&&を使用します.バックグラウンドでこのコマンドを実行していることを知っていますが、nohupは何をしていますか.これはunixの信号から言えば、unixの信号メカニズムはプロセス間通信の一種と言える.プロセス間では信号を送信することで特定の動作を完了することができる.root@limt ~]# kill -l  1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP  6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1 11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM 16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP 21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ 26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR 31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3 38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8 43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7 58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2 63) SIGRTMAX-1  64) SIGRTMAX [root@limt ~]# more/usr/include/bits/signum.h  #define SIGHUP          1      /* Hangup (POSIX).  */#define SIGINT          2      /* Interrupt (ANSI).  */#define SIGQUIT         3      /* Quit (POSIX).  */#define SIGILL          4      /* Illegal instruction (ANSI).  */#define SIGTRAP         5      /* Trace trap (POSIX).  */#define SIGABRT         6      /* Abort (ANSI).  */#define SIGIOT          6      /* IOT trap (4.2 BSD).  */#define SIGBUS          7      /* BUS error (4.2 BSD).  */#define SIGFPE          8      /* Floating-point exception (ANSI).  */#define SIGKILL         9      /* Kill, unblockable (POSIX).  */#define SIGUSR1         10      /* User-defined signal 1 (POSIX).  */#define SIGSEGV         11      /* Segmentation violation (ANSI).  */#define SIGUSR2         12      /* User-defined signal 2 (POSIX).  */#define SIGPIPE         13      /* Broken pipe (POSIX).  */#define SIGALRM         14      /* Alarm clock (POSIX).  */#define SIGTERM         15      /* Termination (ANSI).  */#define SIGSTKFLT       16      /* Stack fault.  */#define SIGCLD          SIGCHLD/* Same as SIGCHLD (System V).  */#define SIGCHLD         17      /* Child status has changed (POSIX).  */#define SIGCONT         18      /* Continue (POSIX).  */#define SIGSTOP         19      /* Stop, unblockable (POSIX).  */#define SIGTSTP         20      /* Keyboard stop (POSIX).  */#define SIGTTIN         21      /* Background read from tty (POSIX).  */#define SIGTTOU         22      /* Background write to tty (POSIX).  */#define SIGURG          23      /* Urgent condition on socket (4.2 BSD).  */#define SIGXCPU         24      /* CPU limit exceeded (4.2 BSD).  */#define SIGXFSZ         25      /* File size limit exceeded (4.2 BSD).  */#define SIGVTALRM       26      /* Virtual alarm clock (4.2 BSD).  */#define SIGPROF         27      /* Profiling alarm clock (4.2 BSD).  */#define SIGWINCH        28      /* Window size change (4.3 BSD, Sun).  */#define SIGPOLL         SIGIO  /* Pollable event occurred (System V).  */#define SIGIO           29      /* I/O now possible (4.2 BSD).  */#define SIGPWR          30      /* Power failure restart (System V).  */#define SIGSYS          31      /* Bad system call. */各信号システムについては一般的にデフォルトの動作(一般的にプログラムを終了する)があるが、SIGKILL、SIGSTOP信号のほかに、他の信号をキャプチャして処理することができ、あるプロセスは別のプロセスに信号を発生させ、kill-signal pidまたは者呼び出し関数killを通じて私たちの前の問題に戻ることができるが、なぜnohupなのか.Scrtという端末ツールを使って終了すると、現在のshellで起動しているプロセスにSIGHUP信号が発生し、SIGHUP信号のデフォルト動作でプロセスが終了するので、nohupはSIGHUP信号を遮断することを意味します.
次のテストを行います.
           nohup     
[root@limt ~]# sh  Testlsof.sh > 111.log &
[1] 4486 
[root@limt ~]# jobs
[1]+  Running                 sh Testlsof.sh > 111.log &
             
[root@limt ~]# ps -ef|grep Testlsof
root      4486  4315  0 20:11 pts/1    00:00:00 sh Testlsof.sh
root      4574  4500  0 20:12 pts/0    00:00:00 grep Testlsof
       ,       
[root@limt ~]# ps -ef|grep Testlsof
root      4661  4500  0 20:12 pts/0    00:00:00 grep Testlsof

          nohup     
[root@limt ~]# nohup sh Testlsof.sh > 111.log &
[1] 2710
[root@limt ~]# nohup:                
[root@limt ~]# jobs
[1]+  Running                 nohup sh Testlsof.sh > 111.log &
             
[root@limt ~]# ps -ef|grep Testlsof
root      2710  2664  0 20:23 pts/1    00:00:00 sh Testlsof.sh   //    shell
root      2794  2728  0 20:23 pts/2    00:00:00 grep Testlsof
       ,        
[root@limt ~]# ps -ef|grep Testlsof
root      2710     1  0 20:23 ?        00:00:00 sh Testlsof.sh   <span style="font-family: Arial, Helvetica, sans-serif;">//    init  </span>
root      3223  2728  0 20:23 pts/2    00:00:00 grep Testlsof

どのように端末を閉じてSIGHUP信号が発生したことを証明しますか?trapコマンドを使用してSIGHUPをマスクできます.SIGHUPの値は1です.次のコマンドを使用します.
[root@limt ~]# trap "" 1
             nohup     
[root@limt ~]# sh  Testlsof.sh > 111.log &
[1] 4068
[root@limt ~]# jobs
[1]+  Running                 sh Testlsof.sh > 111.log &
             
[root@limt ~]# ps -ef|grep Test
root      4068  2728  0 20:26 pts/2    00:00:00 sh Testlsof.sh
root      4096  3963  0 20:26 pts/0    00:00:00 grep Test
       ,        
[root@limt ~]# ps -ef|grep Test
root      4068     1  0 20:26 ?        00:00:00 sh Testlsof.sh  //         ,      1
root      4180  3963  0 20:26 pts/0    00:00:00 grep Test

cshを使用している場合はnohupコマンドを使用する必要はありません.cshはSIGHUPを処理しているからです.
[root@limt ~]# csh
[root@limt ~]# sh  Testlsof.sh > 111.log &
[1] 4602
[root@limt ~]# jobs
[1]  + Running                       sh Testlsof.sh > 111.log

             
[root@limt ~]# ps -ef|grep Testlsof
root      4602  4509  0 20:31 pts/1    00:00:00 sh Testlsof.sh
root      4658  4524  0 20:32 pts/0    00:00:00 grep Testlsof
       ,        
[root@limt ~]# ps -ef|grep Testlsof
root      4602     1  0 20:31 ?        00:00:00 sh Testlsof.sh
root      4676  4524  0 20:32 pts/0    00:00:00 grep Testlsof