如何防止exec zsh终止当前zsh运行的后台作业?
关于zsh中
exec zsh终止后台作业的问题解答 1. 这是不是预期行为?
是zsh的预期行为。exec zsh会用新的zsh进程直接替换当前shell进程,原shell进程退出时,默认会给它管理的所有后台作业(子进程)发送SIGHUP信号,未对该信号做特殊处理的进程就会被终止。
2. 是否意味着有未完成后台作业时绝不能执行exec zsh?
当然不是。如果你的需求就是替换当前shell,且不在乎后台作业被终止,完全可以执行exec zsh。只有当你需要保留这些后台作业继续运行时,才需要提前做处理。
3. 有没有配置或操作可以避免这个行为?
有多种方法可以避免后台作业被终止:
- 用
disown移除作业:执行disown %<作业号>或者disown -a(移除所有后台作业),把作业从zsh的作业列表中剔除,原shell退出时就不会给这些作业发SIGHUP; - 让作业忽略
SIGHUP:启动作业时用nohup,比如nohup sleep 300 &;或者在作业启动后,给它设置trap '' HUP让其忽略SIGHUP信号; - 修改当前shell的
HUP陷阱:在当前shell中执行trap '' HUP,这样shell退出时不会给任何子进程发送SIGHUP信号; - 用
setsid启动作业:setsid sleep 300 &会让作业在新的会话中运行,脱离当前shell的控制,不受当前shell退出的影响。
4. 检查作业、提示符显示数量是不是仅有的解决方式?
不是。上面提到的disown、nohup、setsid、修改HUP陷阱这些都是更直接的避免后台作业被终止的方法。而检查作业、提示符显示数量属于事前提醒的手段,目的是让你在执行exec zsh前意识到有后台作业存在,从而选择是否处理;前面的方法则是直接干预,让后台作业能在shell替换后继续运行。
内容的提问来源于stack exchange,提问作者PRouleau
相关产品推荐
相关产品推荐

