You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使Bash脚本持续运行并按需终止?如何在服务器运行startnode.sh后安全退出?

我来帮你解决这两个Bash脚本运行的问题,都是服务器管理里很常见的需求,给你几种实用的方案:

问题1:让Bash脚本持续运行并可按需终止

这里有三种主流方案,覆盖临时运行和长期稳定运行的场景:

方法1:使用nohup结合后台运行

这是最简单的临时方案,适合单次运行的脚本:

  • 启动脚本:在终端里执行,&表示后台运行,nohup会让脚本脱离当前终端会话:
    nohup ./your_script.sh &
    
    如果你想自定义输出日志(避免默认的nohup.out文件),可以重定向输出:
    nohup ./your_script.sh > script_logs.log 2>&1 &
    
    这里2>&1是把错误输出也合并到日志文件里。
  • 终止脚本:先找到脚本的进程ID(PID):
    ps aux | grep your_script.sh
    
    然后用kill命令终止:
    kill <找到的PID>
    
    如果进程没响应,用强制终止命令:
    kill -9 <找到的PID>
    

方法2:使用screen或tmux(推荐,灵活可控)

这两个工具都是终端会话管理器,能让你随时回到脚本的运行界面,非常适合需要后续查看输出的场景:

以screen为例:

  1. 先安装screen(如果服务器没装):
    # Ubuntu/Debian
    sudo apt install screen
    # CentOS/RHEL
    sudo yum install screen
    
  2. 启动会话并运行脚本:
    screen -S my_script_session  # 创建名为my_script_session的会话
    ./your_script.sh  # 运行脚本
    
  3. 脱离会话(不中断脚本):按Ctrl + A + D,此时你可以正常退出服务器,脚本会在后台持续运行。
  4. 回到会话查看状态:下次登录服务器后,执行:
    screen -r my_script_session
    
  5. 终止脚本:要么回到会话后按Ctrl + C停止脚本,再输入exit关闭会话;要么直接在终端执行:
    screen -S my_script_session -X quit
    

tmux的用法和screen类似,只是快捷键不同(比如脱离会话是Ctrl + B + D),功能更丰富,你可以根据习惯选择。

方法3:配置成systemd服务(长期稳定运行首选)

如果脚本需要长期运行,甚至服务器重启后自动恢复,把它做成systemd服务是最佳选择:

  1. 创建服务配置文件:
    sudo nano /etc/systemd/system/my_script.service
    
    粘贴以下内容(替换成你的脚本路径和用户名):
    [Unit]
    Description=持续运行的Bash脚本
    After=network.target  # 如果脚本依赖网络,加上这行
    
    [Service]
    ExecStart=/path/to/your_script.sh  # 脚本的绝对路径
    Restart=always  # 脚本意外退出时自动重启
    User=your_username  # 运行脚本的用户(避免用root)
    WorkingDirectory=/path/to/script/directory  # 脚本所在目录
    
    [Install]
    WantedBy=multi-user.target
    
  2. 启用并启动服务:
    sudo systemctl daemon-reload
    sudo systemctl enable my_script.service  # 设置开机自启
    sudo systemctl start my_script.service
    
  3. 终止脚本:
    sudo systemctl stop my_script.service
    
  4. 查看运行状态:
    sudo systemctl status my_script.service
    
问题2:运行startnode.sh后退出服务器不中断运行

这个需求本质就是让脚本脱离当前终端会话持续运行,直接套用上面的方案即可,给你针对startnode.sh的具体操作:

方案1:用nohup快速启动

# 直接后台运行,输出日志到geth_node.log
nohup ./startnode.sh > geth_node.log 2>&1 &

执行完后直接退出服务器就行,脚本会一直在后台运行。

方案2:用screen管理Geth节点

screen -S geth_node
./startnode.sh
# 按Ctrl+A+D脱离会话,然后退出服务器

下次登录后可以用screen -r geth_node回到节点的运行界面,查看日志或操作节点。

方案3:配置成systemd服务(长期运行Geth节点推荐)

把服务文件里的ExecStart改成你的startnode.sh绝对路径,比如:

ExecStart=/home/yourname/startnode.sh

按照前面的步骤启用服务后,你的Geth节点会长期稳定运行,就算服务器重启也会自动启动。

内容的提问来源于stack exchange,提问作者Dike Jude

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:01:16