San Domingo's Blog

Courage, Duty, Honor!

让进程在后台运行

| Comments

当使用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信号。

« Macbook修复万金油

Comments