获取使用sshpass启动的远程进程的PID

时间:2018-06-14 07:15:48

标签: linux pid nohup sshpass

我有一个bash脚本,需要在远程机器上启动一些进程。 我已经使用sshpass命令完成了这项工作。

我需要存储该远程进程的PID。

我用脚本尝试了以下内容:

sshpass -p password ssh user@ipaddr /bin/bash << EOF nohup process > /dev/null 2>&1 & echo $! > pid_file cat pid_file EOF

当我检查远程机器时,进程启动并且pid_file也有一个写在其中的数字。但是pid_file的进程ID和数量不匹配。

直接在没有脚本的终端上执行上述命令集,不会在pid_file中写任何内容。

有人可以帮助存储正确的远程进程pid。

1 个答案:

答案 0 :(得分:2)

sshpass -p password ssh user@ipaddr /bin/bash << EOF
nohup process > /dev/null 2>&1 & echo $! > pid_file
cat pid_file
EOF

问题是$!不是在远程计算机上扩展,而是在计算机上扩展。使用Here document时,变量名称将替换为其值。因此它扩展到您在计算机后台运行的任何进程。您需要在远程计算机上执行echo $!。这就是使用-c并始终正确包含参数的原因。

sshpass -p password ssh user@ipaddr /bin/bash -c 'nohup process >/dev/null 2>&1 & echo $! > pid_file'

或者你可以逃避$!

sshpass -p password ssh user@ipaddr /bin/bash << EOF
nohup process > /dev/null 2>&1 & echo \$! > pid_file
cat pid_file
EOF

但我发现使用-c更不容易出错。