ssh升级后nohup进程在终端退出后消失

现象

ssh升级后nohup进程在终端退出后消失, ssh版本如下:

# ssh -V
OpenSSH_8.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017

怀疑是OpenSSH的bug。

临时解决办法

方式1

终端ssh登录后,再通过:su - 用户 后执行nohup指令,这样再退出终端后,进程仍可保留。

方式2(经验证,还是不行,过几分还是会被SIGKILL干掉)

如果上述方式还不行,可以用strace跟踪一下看看是什么信号导致进程终止的。

# strace -T -tt -e trace=all -p 28842
strace: Process 28842 attached
15:46:35.200201 read(4, 

0x7bf1c0, 20)   = ? ERESTARTSYS (To be restarted if SA_RESTART is set) <82.387507>
15:47:57.587934 --- SIGHUP {si_signo=SIGHUP, si_code=SI_KERNEL} ---
15:47:57.588034 read(4, 0x7bf1c0, 20)   = ? ERESTARTSYS (To be restarted if SA_RESTART is set) <0.001049>
15:47:57.589260 --- SIGTERM {si_signo=SIGTERM, si_code=SI_USER, si_pid=1, si_uid=0} ---
15:47:57.589429 +++ killed by SIGTERM +++

这里的情况是被SIGTERM终止,正常情况下,SIGTERM信号是不会传递给nohup子进程的。
临时解决办法:
将要nohup执行的命令加到sh脚本中,然后再sh的前面部分加入SIGTERM信号的拦截:

# cat 1.sh
trap '' SIGTERM   ##这里拦截,让它不处理
tail -f gun

# nohup ./1.sh &

原因及最终解决办法

OpenSSH_8.4后加了sshd.socket方式启动sshd服务,而以这种方式启动,使用的服务配置文件为:sshd@.service

[root@2]cd /usr/lib/systemd/system/
[root@2 system]# vi sshd@.service 
[Unit]
Description=OpenSSH per-connection server daemon
Documentation=man:sshd(8) man:sshd_config(5)
Wants=sshd-keygen.service
After=sshd-keygen.service

[Service]
EnvironmentFile=-/etc/sysconfig/sshd
ExecStart=-/usr/sbin/sshd -i $OPTIONS
KillMode=process     ### 相比sshd.service少了这个设置
StandardInput=socket

加上上述配置,重启sshd.socket方式服务即可。

为了确保Python脚本在Linux环境下能够在用户断开SSH会话后依然在后台稳定运行,你可以采用以下几种方法:(步骤、代码、mermaid流程图、扩展内容,此处略) 参考资源链接:[Linux下Python脚本后台运行的方法:fork、upstart、bash、screen与tmux](https://wenku.csdn.net/doc/6401abd5cce7214c316e9ab9?spm=1055.2569.3001.10343) 1. 使用`&`操作符:这是最简单的后台运行方法,只需要在命令后添加`&`符号,例如`python test.py &`。但是这种方法的缺点是,如果SSH会话被关闭,该进程也会被杀死。 2. 使用`nohup`命令:通过在命令前加上`nohup`并重定向输出,例如`nohup python test.py > /dev/null 2>&1 &`,可以保持进程退出SSH会话后继续运行。`nohup`命令会忽略所有的挂断信号,且`/dev/null`会丢弃所有的输出。 3. 使用`screen`或`tmux`:这些终端多路复用器允许你从一个终端会话中分离并重新连接。例如,使用`screen -d -m python test.py`或`tmux new -s session_name`来启动脚本,之后即使SSH会话断开,你也可以通过`screen -r`或`tmux attach`重新连接到会话并继续监控进程。 4. 编写Upstart脚本:对于系统级的服务,你可以通过编写一个Upstart配置文件来管理服务。配置文件定义了服务启动的条件和命令。例如,创建`/etc/init/test.conf`文件并定义启动命令`python test.py`,之后可以使用`start test`和`stop test`命令来管理服务。 5. 使用守护进程:通过`os.fork()`在Python中创建守护进程,这涉及到父进程退出和子进程的工作目录及会话ID的设置,以确保进程完全脱离控制终端并稳定运行。 每种方法都有其适用场景,例如`&`操作符适合快速测试,`nohup`和守护进程适合长期运行的任务,`screen`和`tmux`提供更高的交互性和灵活性,而Upstart适合需要系统服务管理的场合。在选择合适的方法时,需要根据脚本的运行需求和预期的控制程度来决定。 参考资源链接:[Linux下Python脚本后台运行的方法:fork、upstart、bash、screen与tmux](https://wenku.csdn.net/doc/6401abd5cce7214c316e9ab9?spm=1055.2569.3001.10343)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值