终端进程和其启动进程之间的关系
用nohup运行命令可以使命令永久的执行下去,和用户终端没有关系,例如我们断开SSH连接都不会影响他的运行,注意了nohup没有后台运行的意思;&才是后台运行
&是指在后台运行,但当用户推出(挂起)的时候,命令自动也跟着退出
使用&后台运行程序:
-
结果会输出到终端
-
使用Ctrl + C发送SIGINT信号,程序免疫
-
关闭session发送SIGHUP信号,程序关闭
使用nohup运行程序:
-
结果默认会输出到nohup.out
-
使用Ctrl + C发送SIGINT信号,程序关闭
-
关闭session发送SIGHUP信号,程序免疫
平日线上经常使用nohup和&配合来启动程序:
-
同时免疫SIGINT和SIGHUP信号
同时,还有一个最佳实践:
-
不要将信息输出到终端标准输出,标准错误输出,而要用日志组件将信息记录到日志里
守护进程和其区别:
1.守护进程已经完全脱离终端控制了,而后台进程并未完全脱离终端,在终端未关闭前还是会往终端输出结果。
2.守护进程在关闭终端控制台时不会受影响,而后台程序会随用户退出而停止,需要在以nohup command &格式运行才能避免影响。
3.守护进程的会话组和当前目录,文件描述符都是独立的,后台运行只是终端进行了一次fork,让程序在后台执行,这些都没改变。
查看守护进程:
ps -axj
-a表示显示由其他用户所拥有的进程的状态
-x显示没有控制终端的进程状态
-j显示与作业有关的信息:会话ID、进程组ID等
4.使普通进程达到守护进程的部分效果:
nohup ./a.out &
终端进程和终端启动进程之间的关系:
https://blog.csdn.net/ybxuwei/article/details/77149575
用 fork 创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程
往往要调用一种 exec 函数以执行另一个程序。当进程调用一种 exec 函数时,该进程的用户空间
代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用 exec 并不创建新进程,所
以调用 exec 前后该进程的id并未改变