Linux中关闭终端后能否用jobs命令查看后台运行进程?
关于Linux后台进程跨终端用jobs管理的问题
结论先行:关闭终端后没法用jobs命令查看原后台进程
jobs是当前shell会话专属的命令,它只能追踪当前shell启动的后台作业。当你关掉原终端,对应的shell进程就结束了,原来的后台进程会被系统进程(比如systemd)接管,但它们已经不属于任何shell的作业列表了,所以新终端里jobs根本找不到这些进程。
替代方案:实现类似kill %1的便捷管理
虽然没法直接用jobs跨终端操作,但可以用这些方法达到类似的便捷性:
1. 用screen/tmux(最推荐)
这是最靠谱的方式,本质是把后台进程放在一个持久化的shell会话里:
# 启动tmux会话(screen用法类似) tmux # 在tmux里运行后台进程 sleep 1h & sleep 2h & # 按Ctrl+B+D退出tmux会话(进程会在后台继续跑)
关掉终端再打开新终端后,重新连接tmux会话:
tmux attach # 此时就能用jobs看到之前的后台作业,也能正常用kill %1、fg %2这类命令操作
2. 给进程存PID文件,方便快速kill
运行进程时把PID写入文件:
sleep 1h & echo $! > /tmp/sleep_job1.pid sleep 2h & echo $! > /tmp/sleep_job2.pid
之后要终止时直接读取PID文件:
kill $(cat /tmp/sleep_job1.pid)
如果是自定义脚本,可以在脚本里自动生成PID文件,管理起来更方便。
3. 用disown让进程脱离shell,但没法再用jobs
在原终端运行后台进程后,用disown让它和当前shell解绑:
sleep 1h & disown %1 sleep 2h & disown %2
这样关掉终端进程不会被终止,但新终端里还是只能用ps aux | grep sleep找PID,没法用jobs,所以这个方法只是保住进程,没法实现kill %1的便捷性,适合临时救急。
内容的提问来源于stack exchange,提问作者Bioinfotec
相关产品推荐
相关产品推荐

