SSH会话结束后保持进程运行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SSH会话结束后保持进程运行相关的知识,希望对你有一定的参考价值。

参考技术A 进程组(process group):

      一个或多个进程的集合,每一个进程组有唯一一个进程组ID,即进程组长进程的ID。

会话期(session):

      一个或多个进程组的集合,有唯一一个会话期首进程(session leader)。会话期ID为首进程的ID。会话期可以有一个单独的控制终端(controlling terminal)。与控制终端连接的会话期首进程叫做控制进程(controlling process)。当前与终端交互的进程称为前台进程组。其余进程组称为后台进程组。

1. 挂断信号(SIGHUP)默认的动作是终止程序。

2. 当终端接口检测到网络连接断开,将挂断信号发送给控制进程(会话期首进程)。

3. 如果会话期首进程终止,则该信号发送到该会话期前台进程组。

4. 一个进程退出导致一个孤儿进程组中产生时,如果任意一个孤儿进程组进程处于STOP状态,发送SIGHUP和SIGCONT信号到该进程组中所有进程。

5. 因此当网络断开或终端窗口关闭后,控制进程收到SIGHUP信号退出,会导致该会话期内其他进程退出。

      如果我们可以忽略SIGHUP信号,关掉窗口应该就不会影响程序的运行了。nohup命令可以达到这个目的,如果程序的标准输出/标准错误是终端,nohup默认将其重定向到nohup.out文件。值得注意的是nohup命令只是使得程序忽略SIGHUP信号,还需要使用标记&把它放在后台运行。

使用脚本保持远程会话运行直到程序结束?

【中文标题】使用脚本保持远程会话运行直到程序结束?【英文标题】:Keep a remote seesion running until the end of a program using a script? 【发布时间】:2020-07-04 12:17:44 【问题描述】:

我想在 Linux 服务器 A 上运行一个程序。Linux 服务器 B 可以监控服务器 A 的功率指标​​。 但是为了测量在服务器 A 上运行的程序,我需要在服务器 A 上的程序开始时打开服务器 B 上的测量脚本,然后在服务器 B 上手动结束它。

所以总结一下,如何通过脚本 ssh 进入服务器以运行程序并在之后终止它?

【问题讨论】:

【参考方案1】:

这里需要一些技巧。 1. 我正在使用sshpass 通过 ssh 自动输入机器密码(以纯文本形式存储在不安全的脚本中)。 2. 我正在这个脚本中编写一个脚本,然后通过 ssh 执行 3. 我将服务器A上运行的程序的pid存储在它的/tmp目录中

#!/bin/bash
PROGRAM_TO_RUN_ON_SERVER_A="sleep 1000"
PASSWORD_TO_USER_ON_SERVER_A="password"
SERVER_A_USER="user"
SERVER_A_MACHINE_NAME="machine-name"

# Create a local script to run on server A
SCRIPT=/tmp/script.sh
export SSHPASS=$PASSWORD_TO_USER_ON_SERVER_A
echo '#!/bin/bash' > $SCRIPT
echo "(( $PROGRAM_TO_RUN_ON_SERVER_A 0<&- &>/dev/null & echo $! > /tmp/pid.txt) &)" >> $SCRIPT

# Execute script on server A (This also executes your program)
sshpass -e ssh $SERVER_A_USER@$SERVER_A_MACHINE_NAME 'bash -s' < $SCRIPT

# Do server B timing analysis things here
# ...
# ...
# ...

# Kill the program running on server A
sshpass -e ssh $SERVER_A_USER@$SERVER_A_MACHINE_NAME 'cat /tmp/pid.txt | xargs kill -9'

Getting ssh to execute a command in the background on target machine

【讨论】:

感谢您提供此脚本。刚刚检查了服务器 B。它是对 linux comamnds 的有限支持的嵌入系统(它使用一个名为 ash 的特殊外壳)。它不支持nohup。有什么解决方法吗? ***.com/questions/29704358/… 不知何故我在最后使用了 simpe & 符号。

以上是关于SSH会话结束后保持进程运行的主要内容,如果未能解决你的问题,请参考以下文章

Qt QProcess startDetached 无法结束进程(bash 会话)

Windows ssh - 如何在断开连接后保持进程运行

[转载][整理]解决SSH退出登陆后保持进程继续在后台运行

CentOS 不间断会话(ssh关闭后如何保证程序继续运行)(nohup和screen)

结束 ssh 会话后在后台运行 python/matplotlib 的问题

linu保持远程会话