要将一个命令放到后台执行,我们一般使用nohup sh command &

&都知道是放到后台执行这个命令,那么nohup是做什么的?

这就要从unix的信号说起,unix的信号机制可以说进程间通信的一种,进程间可以通过发送信号来完成某些特定的动作,比较熟悉就是kill -9 pid

先看linux有哪些信号:

[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信号

下面我们做一个测试:

  1. 在一个窗口运行一个不带nohup的后台程序
  2. [root@limt ~]# sh Testlsof.sh > 111.log &
  3. [1] 4486
  4. [root@limt ~]# jobs
  5. [1]+ Running sh Testlsof.sh > 111.log &
  6. 在另外一个窗口查看后台程序
  7. [root@limt ~]# ps -ef|grep Testlsof
  8. root 4486 4315 0 20:11 pts/1 00:00:00 sh Testlsof.sh
  9. root 4574 4500 0 20:12 pts/0 00:00:00 grep Testlsof
  10. 关闭第一个窗口,后台进程也退出
  11. [root@limt ~]# ps -ef|grep Testlsof
  12. root 4661 4500 0 20:12 pts/0 00:00:00 grep Testlsof
  13.  
  14. 在一个窗口运行一个带nohup的后台程序
  15. [root@limt ~]# nohup sh Testlsof.sh > 111.log &
  16. [1] 2710
  17. [root@limt ~]# nohup: 忽略输入重定向错误到标准输出端
  18. [root@limt ~]# jobs
  19. [1]+ Running nohup sh Testlsof.sh > 111.log &
  20. 在另外一个窗口查看后台程序
  21. [root@limt ~]# ps -ef|grep Testlsof
  22. root 2710 2664 0 20:23 pts/1 00:00:00 sh Testlsof.sh //父进程为shell
  23. root 2794 2728 0 20:23 pts/2 00:00:00 grep Testlsof
  24. 关闭第一个窗口,后台进程没有退出
  25. [root@limt ~]# ps -ef|grep Testlsof
  26. root 2710 1 0 20:23 ? 00:00:00 sh Testlsof.sh <span style="font-family: Arial, Helvetica, sans-serif;">//父进程为init进程</span>
  27. root 3223 2728 0 20:23 pts/2 00:00:00 grep Testlsof

怎么证明关闭终端发生的是SIGHUP信号?可以使用trap命令屏蔽SIGHUP,SIGHUP的值为1,使用如下命令:

  1. [root@limt ~]# trap "" 1
  2. 然后在一个窗口运行一个不带nohup的后台程序
  3. [root@limt ~]# sh Testlsof.sh > 111.log &
  4. [1] 4068
  5. [root@limt ~]# jobs
  6. [1]+ Running sh Testlsof.sh > 111.log &
  7. 在另外一个窗口查看后台程序
  8. [root@limt ~]# ps -ef|grep Test
  9. root 4068 2728 0 20:26 pts/2 00:00:00 sh Testlsof.sh
  10. root 4096 3963 0 20:26 pts/0 00:00:00 grep Test
  11. 关闭第一个窗口,后台进程没有退出
  12. [root@limt ~]# ps -ef|grep Test
  13. root 4068 1 0 20:26 ? 00:00:00 sh Testlsof.sh //当第一个窗口关闭后,它的父进程为1
  14. root 4180 3963 0 20:26 pts/0 00:00:00 grep Test

如果你使用的是csh,那么就无需使用nohup命令,因为csh对SIGHUP做了处理

  1. [root@limt ~]# csh
  2. [root@limt ~]# sh Testlsof.sh > 111.log &
  3. [1] 4602
  4. [root@limt ~]# jobs
  5. [1] + Running sh Testlsof.sh > 111.log
  6.  
  7. 在另外一个窗口查看后台程序
  8. [root@limt ~]# ps -ef|grep Testlsof
  9. root 4602 4509 0 20:31 pts/1 00:00:00 sh Testlsof.sh
  10. root 4658 4524 0 20:32 pts/0 00:00:00 grep Testlsof
  11. 关闭第一个窗口,后台进程没有退出
  12. [root@limt ~]# ps -ef|grep Testlsof
  13. root 4602 1 0 20:31 ? 00:00:00 sh Testlsof.sh
  14. root 4676 4524 0 20:32 pts/0 00:00:00 grep Testlsof

nohup命令浅析的更多相关文章

  1. linux–nohup命令(转)

    在应用Unix/Linux时,我们一般想让某个程序在后台运行,于是我们将常会用 & 在程序结尾来让程序自动运行.比如我们要运行mysql在后台: /usr/local/mysql/bin/my ...

  2. 菜鸟学Linux命令:nohup命令启动程序

    在UNIX/LINUX中,普通进程用&符号放到后台运行,如果启动该程序的控制台logout,则该进程随即终止. 要实现守护进程,一种方法是按守护进程的规则去编程,比较麻烦:另一种方法是仍然用普 ...

  3. Linux_解决nohup命令生成的多余的大日志文件

    解决nohup命令生成的多余的大日志文件 经常使用命令 nohup /usr/bin/php /srv/www/update.php & 可以让它在后台安静的进行,但是有一个烦恼就是,它会生成 ...

  4. linux 后台运行命令 nohup命令

    转载:http://if.ustc.edu.cn/~ygwu/blog/archives/000538.html 2005年04月18日 简单而有用的nohup命令在UNIX/LINUX中,普通进程用 ...

  5. Linux基础知识之—— nohup命令使程序在后台运行的方法

    在linux操作系统中从后台一直运行某个程序的方法,就是使用nohup命令了. 参照网址:http://www.jb51.net/LINUXjishu/189964.html

  6. linux的nohup命令的用法

    在应用Unix/Linux时,我们一般想让某个程序在后台运行,于是我们将常会用 & 在程序结尾来让程序自动运行.比如我们要运行mysql在后台: /usr/local/mysql/bin/my ...

  7. LINUX nohup命令输入输出深浅进出

    无论是否将 nohup命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中.如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中 ...

  8. 实用技巧:简单而有用的nohup命令介绍(转)

    简单而有用的nohup命令在UNIX/LINUX中,普通进程用&符号放到后台运行,如果启动该程序的控制台logout,则该进程随即终止. 要实现守护进程,一种方法是按守护进程的规则去编程(本站 ...

  9. Linux nohup命令详解

    nohup命令及其输出文件                                                                                       ...

随机推荐

  1. NuGet安装和使用

    1. NuGet是什么? NuGet is a Visual Studio 2010 extension that makes it easy to add, remove, and update l ...

  2. 静态内容生成器——Wyam

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:今天继续静态网站的话题,介绍我选用的一个使用.NET开发的静态内容生成器--Wyam. ...

  3. VS2010和matlab2010混合编程中char16_t重定义的问题

    原因是VS2010中的yvals.h添加了char16_t的定义,而Matlab的matrix.h也包含对char16_t的定义,所以同时包含这两个头文件的话,会导致重复定义char16_t的错误.只 ...

  4. Effective C++ 之 Item 2:尽量以 const, enum, inline 替换 #define

    Effective C++ Chapter 1. 让自己习惯C++(Accustoming Yourself to C++) Item 2. 尽量以 const, enum, inline 替换 #d ...

  5. 在Salesforce中创建Web Service供外部系统调用

    在Salesforce中可以创建Web Service供外部系统调用,并且可以以SOAP或者REST方式向外提供调用接口,接下来的内容将详细讲述一下用SOAP的方式创建Web Service并且用As ...

  6. 汇编学习(六)——代码转换程序

    (一)逻辑运算指令 一.双操作数逻辑运算指令 1.指令格式: AND dst,src ; "与"运算, OR dst,src ; "或"运算 XOR dst,s ...

  7. 开始我的PostgreSQL的学习之旅

    经过这么长时间的学习,终于确定了我的研究方向是PostgreSQL的空间数据库的设计流程,具体怎样实现这个过程,其难度是挺大的,我必须克服掉,尽量得往前看.大家有相同的研究方向的,可以一同来学习,相互 ...

  8. ImageSpan

    自定义ImageSpan继承类,可以设置图片大小和位置 import android.content.Context; import android.graphics.Bitmap; import a ...

  9. 解读Web Page Diagnostics网页细分图

    解读Web Page Diagnostics网页细分图 http://blog.sina.com.cn/s/blog_62b8fc330100red5.html Web Page Diagnostic ...

  10. loadrunner取出关联数组中的所有元素

    方法一: int num; char nameVar[100]; char nameValue[100]; lr_save_string("AAA","name_1&qu ...