使用 & 一开始就将任务放到后台运行
如 ./xxx.sh &
非正常退出 shell 如直接打叉, kill 等, 也会结束后台任务。因为运行脚本的父进程是当前 shell 进程,关闭当前 shell 终端时,会发送 hangup 信号给子进程,子进程收到 hangup 信号后退出。
用 exit(ctrl+d) 退出,则不会发送 hangup 信号, 可以继续在后台运行。
使用 ctrl + z + bg 将前台任务转入后台运行
先ctrl + z切换当前任务到后台并冻结任务,再用 jobs 可以查看到所有后台任务的 jobs-id,接着bg jobs-id 可以后台恢复运行冻结的任务, 相当于./xxx.sh &
使用 nohub 解决使用 & 异常退出后任务中断
nohub可以忽略任务挂断信号 nohup ./xxx.sh & shell 退出也不会结束任务。
使用 disown -h 解决任务运行时忘记使用 nohub
任务运行时, 忘记使用了nohub, 任务执行后想达到使用 nohub 的效果, 则可以使用 disown -h job-id 补救。
使用 setsid 和 & 一开始就将任务放到后台运行
如 setsid ./xxx.sh & , setsid 会创建一个新会话进程来执行任务, 新会话进程的父进程 PID 为 1(即 init 程序), 运行任务与当前会话就无关了。
使用 () 和 & 一开始就将任务放到后台运行
如 (./xxx.sh &) 也会创建一个新的 shell 来执行任务, 新的 shell 进程父进程PID 也是 1, 运行任务与当前会话就无关了。
三个相关命令
- jobs
查看当前 shell 中的后台任务和任务的job-id。 - bg
bg job-id后台恢复运行某被冻结的任务。 - fg
bg job-id切换后台任务到前台运行。