当使用ssh连接到服务器运行程序时,用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程。但这往往不是我们想要的结果。为了避免这种情况的发生,让程序能够在服务器上正常运行,的解决办法就有两种途径:
- 让进程忽略HUP信号;
- 让进程运行在新的会话里从而成为不属于此终端的子进程。
nohup … &
nohup命令用途就是让提交的命令忽略HUP信号;&命令用途是让提交的命令在后台运行。同时使用nohup ... &
可以让提交的命令忽略HUP信号,并将该命令放在后台运行。
e.g.:nohup sh big_task.sh > big_task.log 2>&1
Q:nohup 和 nohup … & 的区别?
A:nohup仅表示让提交的命令忽略hangup信号,但该命令仍然在前台运行,当前的shell会被阻塞,无法继续进行操作。但可以通过 ctrl-z
将当前的命令挂起到后台,然后再使用bg命令让其在后台运行,这样就可以达到和使用nohup ... &
同样的效果
Q:仅使用 & 命令会如何?
A:仅使用&
命令仅会将命令放在后台执行,但仍然可能会受到HUP信号的影响。但此时可以通过使用disown -h
命令让其忽略HUP信号
setsid
setsid可以让提交的命令在一个新的session中运行,新的进程不属于接受hangup信号的终端的子进程,这样即使ssh连接中断,新的进程也不会受到影响。
screen
screen可以用来创建一个新的session,它不属于ssh连接进程的子进程,因而不需要费心考虑HUP信号。