nohup命令浅析
要将一个命令放到后台执行,我们一般使用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信号
下面我们做一个测试:
在一个窗口运行一个不带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
nohup命令浅析的更多相关文章
- linux–nohup命令(转)
在应用Unix/Linux时,我们一般想让某个程序在后台运行,于是我们将常会用 & 在程序结尾来让程序自动运行.比如我们要运行mysql在后台: /usr/local/mysql/bin/my ...
- 菜鸟学Linux命令:nohup命令启动程序
在UNIX/LINUX中,普通进程用&符号放到后台运行,如果启动该程序的控制台logout,则该进程随即终止. 要实现守护进程,一种方法是按守护进程的规则去编程,比较麻烦:另一种方法是仍然用普 ...
- Linux_解决nohup命令生成的多余的大日志文件
解决nohup命令生成的多余的大日志文件 经常使用命令 nohup /usr/bin/php /srv/www/update.php & 可以让它在后台安静的进行,但是有一个烦恼就是,它会生成 ...
- linux 后台运行命令 nohup命令
转载:http://if.ustc.edu.cn/~ygwu/blog/archives/000538.html 2005年04月18日 简单而有用的nohup命令在UNIX/LINUX中,普通进程用 ...
- Linux基础知识之—— nohup命令使程序在后台运行的方法
在linux操作系统中从后台一直运行某个程序的方法,就是使用nohup命令了. 参照网址:http://www.jb51.net/LINUXjishu/189964.html
- linux的nohup命令的用法
在应用Unix/Linux时,我们一般想让某个程序在后台运行,于是我们将常会用 & 在程序结尾来让程序自动运行.比如我们要运行mysql在后台: /usr/local/mysql/bin/my ...
- LINUX nohup命令输入输出深浅进出
无论是否将 nohup命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中.如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中 ...
- 实用技巧:简单而有用的nohup命令介绍(转)
简单而有用的nohup命令在UNIX/LINUX中,普通进程用&符号放到后台运行,如果启动该程序的控制台logout,则该进程随即终止. 要实现守护进程,一种方法是按守护进程的规则去编程(本站 ...
- Linux nohup命令详解
nohup命令及其输出文件 ...
随机推荐
- [LeetCode] Letter Combinations of a Phone Number
Given a digit string, return all possible letter combinations that the number could represent. A map ...
- 算法系列:CSAPP 推荐
转载自:https://book.douban.com/review/6093947/ 如果你觉得这本书过于厚重担心看不下来的话,不妨跟着coursera的Hardware/Software Inte ...
- POJ3321 Apple Tree(树状数组)
先做一次dfs求得每个节点为根的子树在树状数组中编号的起始值和结束值,再树状数组做区间查询 与单点更新. #include<cstdio> #include<iostream> ...
- C# 遍历指定目录下的所有文件及文件夹
// DirectoryInfo di = new DirectoryInfo(@"D:\Test"); // FindFile(di); static void FindFile ...
- CocoaPods安装和使用教程(转摘)
Code4App 原创文章.转载请注明出处:http://code4app.com/article/cocoapods-install-usage 目录 CocoaPods是什么? 如何下载和安装Co ...
- 不定义JQuery插件,不要说会JQuery 分类: JavaScript 2014-11-24 14:18 155人阅读 评论(0) 收藏
一:导言 有些WEB开发者,会引用一个JQuery类库,然后在网页上写一写$("#"),$("."),写了几年就对别人说非常熟悉JQuery.我曾经也是这样的人 ...
- BAT批量处理 命令
第一章 批处理基础第一节 常用批处理内部命令简介 批处理定义:顾名思义,批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT或者CMD.这些命令统称批处理命令.小知识:可以 ...
- RTCP资料详解
转自:http://www.360doc.com/content/13/0606/10/1317564_290865866.shtml RTCP RTCP协议将控制包周期发送给所有连接者,应用与数据包 ...
- PMP 第十二章 项目采购管理
1规划采购 2实施采购 3管理采购 4结束采购 1.合同的不同叫法?卖方的不同叫法? 2.规划采购管理的目的是什么?合同类型有哪些?不同的特点是什么?何种情况下应选择何种合同?自制或外购分析计算和合同 ...
- 在linux配置NFS用于RAC的搭建
rac的共享存储有很多种搭建方式,nfs是其中一种.生产环境一般不采用nfs,多用于测试. nfs搭建步骤大致分为如下: 1.划盘 给节点1挂载一块磁盘,并将磁盘分区,并格式化,再挂载 [root@n ...