如何让Bash脚本在后台持续运行(关闭终端不终止)?
让Bash脚本在关闭终端后持续运行的几种方法
这个问题很常见——当你关闭终端时,它会给所有子进程发送SIGHUP信号,默认情况下进程收到这个信号就会终止,所以你的脚本才会跟着停掉。下面给你几个实用的解决方案,按需选择:
1. 使用nohup忽略SIGHUP信号
这是最直接的临时解决方案,nohup的作用就是让进程忽略SIGHUP信号,即使终端关闭也能继续运行。把你的启动命令改成:
nohup bash mybash.sh > /dev/null 2>&1 &
2>&1是把错误输出也重定向到/dev/null,避免生成默认的nohup.out日志文件(如果需要日志,可以把/dev/null换成具体的日志路径,比如/var/log/mybash.log)- 运行后直接关闭终端即可,脚本会在后台持续执行
2. 用disown将进程从shell作业列表移除
如果已经用bash mybash.sh > /dev/null &启动了脚本,还没关闭终端的话,可以用disown把进程从shell的作业管理中移除,这样终端关闭时就不会给它发SIGHUP信号:
- 先运行
jobs查看后台作业的编号,比如输出可能是[1]+ Running bash mybash.sh > /dev/null & - 执行
disown %1(这里的%1对应作业编号) - 或者直接用
disown -h,让所有后台运行的进程都忽略SIGHUP信号
3. 使用screen或tmux创建持久会话
如果需要后续重新连接终端查看脚本状态或输出,screen和tmux是更好的选择,它们会创建一个独立于当前终端的会话:
用screen:
- 先安装screen(Debian/Ubuntu用
sudo apt install screen,CentOS/RHEL用sudo yum install screen) - 运行
screen进入新会话 - 在会话里启动你的脚本:
bash mybash.sh - 按
Ctrl+A+Ddetach会话,此时可以安全关闭终端 - 之后想重新查看的话,运行
screen -r即可重新连接会话
用tmux(功能更强大的替代):
- 安装tmux(
sudo apt install tmux或sudo yum install tmux) - 运行
tmux new -s myscript创建名为myscript的会话 - 在会话里启动脚本
- 按
Ctrl+B+Ddetach会话 - 重新连接用
tmux attach -t myscript
4. 配置systemd服务(推荐长期稳定运行)
如果你的脚本需要长期、稳定地运行,甚至开机自动启动,最好把它做成systemd服务,完全脱离终端控制:
- 创建一个服务文件,比如
/etc/systemd/system/mybash.service,内容如下:
[Unit] Description=My Persistent Bash Script After=network.target # 如果脚本依赖网络,保留这行;否则可以去掉 [Service] ExecStart=/bin/bash /绝对路径/to/mybash.sh # 这里要写脚本的完整绝对路径 Restart=always # 脚本意外终止时自动重启 User=你的用户名 # 替换成实际运行脚本的用户 StandardOutput=null # 输出重定向到/dev/null,和你原来的需求一致 StandardError=null # 错误输出也重定向 [Install] WantedBy=multi-user.target
- 重新加载systemd配置:
sudo systemctl daemon-reload - 启动服务:
sudo systemctl start mybash.service - 设置开机自启:
sudo systemctl enable mybash.service
这样脚本就会作为系统服务运行,不管终端是否打开,甚至重启机器后也会自动启动。
内容的提问来源于stack exchange,提问作者S.M_Emamian




