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信号を遮断することを意味します.
次のテストを行います.
どのように端末を閉じてSIGHUP信号が発生したことを証明しますか?trapコマンドを使用してSIGHUPをマスクできます.SIGHUPの値は1です.次のコマンドを使用します.
cshを使用している場合はnohupコマンドを使用する必要はありません.cshは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