Q为什么我的 Shell 脚本放到后台后还会自己停掉?我用 `&` 把脚本放到后台执行了,关掉终端或退出 SSH 之后它还是没了,这是什么原因? A后台

Q为什么我的 Shell 脚本放到后台后还会自己停掉?我用 `&` 把脚本放到后台执行了,关掉终端或退出 SSH 之后它还是没了,这是什么原因?

A后台任务和终端会话的关系

仅把脚本放到后台并不等于脱离终端会话。很多脚本会在会话结束时收到挂断信号而退出。可以用 nohup、disown、setsid,或改用 systemd、screen、tmux 这类方式,让进程和当前终端分离。

Q怎样让 Shell 脚本在退出 SSH 后继续执行?我经常远程连到服务器执行脚本,断开连接后任务就停了,有没有稳定的写法?

A使用脱离会话的运行方式

可以直接用 nohup bash your_script.sh > run.log 2>&1 &,让脚本忽略挂断信号并把输出写入日志。若脚本需要长期运行,也可以在 tmux 或 screen 中启动,断开连接后任务仍然保持运行。

Q脚本后台运行后,怎么查看它是否还活着?我已经把脚本放到后台了,但不确定它是不是还在跑,应该怎么确认?

A检查进程和日志

可以用 ps -ef | grep your_script、pgrep -af your_script 查看进程状态,也可以检查日志文件有没有持续增长。如果脚本没有输出,建议在关键位置加入日志,方便判断它是正常结束还是异常退出。

Q后台脚本退出时,怎样保留错误信息便于排查?脚本一关终端就没了,我想知道它到底报了什么错,有什么办法把信息保存下来?

A把标准输出和错误输出都重定向到文件

运行时把输出统一写入日志,例如 nohup bash your_script.sh > app.log 2>&1 &。这样标准输出和错误输出都会保留下来,排查时能直接查看日志内容。若脚本比较复杂,也可以在脚本内增加 set -e 和必要的错误日志。