1.什么是守护进程
守护进程daemon指的是在后台运行的进程
2.前台任务和后台任务
前台任务:独占命令行窗口,运行完毕或手动终止,才能执行其他命令
以redis服务为例
redis-server
运行结果:
中止服务或退出session(即服务器连接),就无法访问了
后台任务:中止服务或退出session后,进程仍能访问
redis-server&
运行结果:
中止服务或退出session(即服务器连接)
运行结果:
在命令尾部加上符号&,启动的进程就会成为“后台任务”
对于前台任务,若要变为后台任务,可以现按Ctrl+z,然后执行bg命令(让最后一个执行的任务后台继续执行)
3.后台任务的特点
1)继承当前session(服务器连接)的标准输出(stdout)和标准错误(stderr),因此任务的输出依然会在命令行下显示
2)不再继承当前session的标准输入(stdin),因此输入,没有作用
4.SIGHUP信号
SIGHUP信号的作用是终止收到该信号的进程
Linux退出session会发生以下操作:
1)用户准备退出session
2)系统向该session发出SIGHUP信号
3)session将SIGHUP信号发给所有子进程
4)子进程收到SIGHUP信号,自动退出
由上可知,前台任务会随着session的退出而退出,因为它收到了SIGHUP信号
当Shell的huponexit参数为off时,session退出的时候,不会把SIGHUP信号发给后台任务,因此后台任务不会随着session一起退出。
查看系统huponexit参数值:
有的系统huponexit参数的值可能是on,所以更好的方法是使用disown命令,disown可以将指定任务从任务列表中移除,这样session就不会向她发出SIGHUP信号。
disown用法如下:
disown # 移除最近一个正在执行的后台任务
disown -r # 移除所有正在执行的后台任务
disown -a # 移除所有后台任务
disown -h # 不移除后台任务,但是让它们不会收到SIGHUP信号
disown %2 # 移除指定的后台任务
5.标准IO
disown后,如果退出session后,如果后台进程与标准IO有交互,它还是会挂掉
此时需要对后台任务的标准IO进行重定向。
redis-server > stdout.txt &
6.nohup命令
nohup命令比disown更方便,nohup命令作用如下:
1)阻止SIGHUP信号发到这个进程
2)关闭标准输入。该进程不再接受任何输入
3)重定向标准输出和标准错误到nohup.out
nohup将子进程与它所在的session分离了
nohup不会自动把进程变为“后台任务”,必须加上“&”符号
使用示例如下:
nohup redis-server &
7.Screen命令和Tmux命令
Screen和Tmux命令,可以实现在一个终端里,管理多个session
这样当当前session结束了,也不影响其他session,而且可以重新登录,再连上早先新建的session
使用示例如下:
$ screen
$ redis-server
按下ctrl+A和ctrl+D,可以回到原来的session
screen命令如下:
$ screen -S name
# 切回指定 session
$ screen -r name
$ screen -r pid_number
# 列出所有session
$ screen -ls
tmux功能类似,不再详述
8.Systemd管理工具
除了以上工具,Linux有还有一个守护进程管理工具Systemd,它是操作系统的一部分,直接与内核交互。
后续再详细研究。