如何使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.shkill命令终止:
如果进程没响应,用强制终止命令:kill <找到的PID>kill -9 <找到的PID>
方法2:使用screen或tmux(推荐,灵活可控)
这两个工具都是终端会话管理器,能让你随时回到脚本的运行界面,非常适合需要后续查看输出的场景:
以screen为例:
- 先安装
screen(如果服务器没装):# Ubuntu/Debian sudo apt install screen # CentOS/RHEL sudo yum install screen - 启动会话并运行脚本:
screen -S my_script_session # 创建名为my_script_session的会话 ./your_script.sh # 运行脚本 - 脱离会话(不中断脚本):按
Ctrl + A + D,此时你可以正常退出服务器,脚本会在后台持续运行。 - 回到会话查看状态:下次登录服务器后,执行:
screen -r my_script_session - 终止脚本:要么回到会话后按
Ctrl + C停止脚本,再输入exit关闭会话;要么直接在终端执行:screen -S my_script_session -X quit
tmux的用法和screen类似,只是快捷键不同(比如脱离会话是Ctrl + B + D),功能更丰富,你可以根据习惯选择。
方法3:配置成systemd服务(长期稳定运行首选)
如果脚本需要长期运行,甚至服务器重启后自动恢复,把它做成systemd服务是最佳选择:
- 创建服务配置文件:
粘贴以下内容(替换成你的脚本路径和用户名):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 - 启用并启动服务:
sudo systemctl daemon-reload sudo systemctl enable my_script.service # 设置开机自启 sudo systemctl start my_script.service - 终止脚本:
sudo systemctl stop my_script.service - 查看运行状态:
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
相关产品推荐
相关产品推荐

