You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何让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信号:

  1. 先运行jobs查看后台作业的编号,比如输出可能是[1]+ Running bash mybash.sh > /dev/null &
  2. 执行disown %1(这里的%1对应作业编号)
  3. 或者直接用disown -h,让所有后台运行的进程都忽略SIGHUP信号

3. 使用screentmux创建持久会话

如果需要后续重新连接终端查看脚本状态或输出,screentmux是更好的选择,它们会创建一个独立于当前终端的会话:

用screen:

  1. 先安装screen(Debian/Ubuntu用sudo apt install screen,CentOS/RHEL用sudo yum install screen
  2. 运行screen进入新会话
  3. 在会话里启动你的脚本:bash mybash.sh
  4. Ctrl+A+D detach会话,此时可以安全关闭终端
  5. 之后想重新查看的话,运行screen -r即可重新连接会话

用tmux(功能更强大的替代):

  1. 安装tmux(sudo apt install tmuxsudo yum install tmux
  2. 运行tmux new -s myscript创建名为myscript的会话
  3. 在会话里启动脚本
  4. Ctrl+B+D detach会话
  5. 重新连接用tmux attach -t myscript

4. 配置systemd服务(推荐长期稳定运行)

如果你的脚本需要长期、稳定地运行,甚至开机自动启动,最好把它做成systemd服务,完全脱离终端控制:

  1. 创建一个服务文件,比如/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
  1. 重新加载systemd配置:sudo systemctl daemon-reload
  2. 启动服务:sudo systemctl start mybash.service
  3. 设置开机自启:sudo systemctl enable mybash.service

这样脚本就会作为系统服务运行,不管终端是否打开,甚至重启机器后也会自动启动。

内容的提问来源于stack exchange,提问作者S.M_Emamian

火山引擎 最新活动