如何使用nohup在服务器后台运行N个进程?遇ssh断开进程终止等问题
问题解决办法
1. 解决每次启动新进程时旧进程被关闭的问题
- 检查你的
batch脚本,确认里面是否包含自动终止同类型进程的逻辑(比如pkill batch、killall,或者读取PID文件后杀死旧进程的代码)。如果有这类逻辑,要么移除,要么修改为根据不同配置生成独立的PID文件(比如每个实例对应pid_${配置名}.txt),避免误杀其他实例。 - 给每个实例分配独立的日志文件,不要共用同一个
logfile.txt。比如根据启动参数命名:
共用日志文件可能导致文件锁或脚本内的日志处理逻辑冲突,间接引发进程终止。nohup bash batch 参数1 > logfile_param1.txt 2>&1 <&- & nohup bash batch 参数2 > logfile_param2.txt 2>&1 <&- &
2. 解决关闭SSH会话后进程被终止的问题
- 不要用
source执行脚本,source会在当前shell环境中运行脚本,难以完全脱离终端绑定。坚持用bash batch的方式启动。 - 可以给命令加上
setsid,创建独立的会话,彻底脱离原SSH终端的控制:nohup setsid bash batch 参数 > logfile_xxx.txt 2>&1 <&- & - 确认
batch脚本内的所有子进程也没有依赖终端的操作。如果脚本里启动了其他后台进程,也要确保这些进程不会因为终端关闭而退出(比如在脚本内给子进程也加上nohup或disown)。 - 启动进程后,用
ps aux | grep batch确认进程是否正常运行,同时检查日志文件是否有报错信息,排查脚本是否因自身逻辑退出(比如未处理的错误、循环提前结束)。
额外建议
- 每个实例启动后,将进程PID保存到独立文件,方便后续管理(查看、终止):
nohup bash batch 参数 > logfile_xxx.txt 2>&1 <&- & echo $! > pid_xxx.txt
内容的提问来源于stack exchange,提问作者Daniele Caliandro
相关产品推荐
相关产品推荐

