我们知道,当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程。因此,我们的解决办法就有两种途径:要么让进程忽略 HUP 信号,要么让进程运行在新的会话里从而成为不属于此终端的子进程
nohup
最常用的方法当然就是 nohup 了,顾名思义,就是让任务忽略 HUP 信号
nohup sh test_task.sh > output.txt 2>&1 &
setsid
除了让任务忽略 HUP 信号这样的方式以外,直接让任务脱离终端执行也就不会受到终端退出的影响了
与 nohup 一样,只需在任务命令前加上 setsid 即可
setsid sh test_task.sh > output.txt 2>&1
&
在命令的最后加上 & 符号,命令即会在后台执行,但是此时终端退出,该任务也会随之退出
当我们将"&"也放入“()”内之后,我们就会发现所提交的作业并不在作业列表中,也就是说,是无法通过jobs来查看的
与 setsid 的方式相同,这样执行的任务也会脱离当前终端
(sh test_task.sh > output.txt 2>&1 &)