【问题标题】:Get PID of a remote process started with sshpass获取使用 sshpass 启动的远程进程的 PID
【发布时间】:2023-03-18 04:30:02
【问题描述】:

我有一个 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 中也写入了一个数字。但是进程id和pid_file个数不匹配。

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

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

【问题讨论】:

  • 也许执行nohup process 2&amp;1&gt;pid_file 会给你更多信息。
  • 这样卡住了。我必须在后台运行进程“iperf3”。

标签: linux pid nohup sshpass


【解决方案1】:
sshpass -p password ssh user@ipaddr /bin/bash << EOF
nohup process > /dev/null 2>&1 & echo $! > pid_file
cat pid_file
EOF

问题是$! get 不是在远程计算机上展开的,而是在您的计算机上展开的。使用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

或者最好是在此处使用带引号的字符串分隔符:

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

【讨论】:

  • 是的宾果游戏。谢谢卡米尔。这个逃脱角色真的很有帮助。我不能使用-c 选项,因为在执行命令之前需要进行更多验证。但另一个问题是cat pid_file 没有保存在变量中。我做了var=$(cat pid_file)echo $var 给出了空白。可能是什么原因?
  • 您可以使用此处文档或此处字符串执行的所有操作都可以通过将-c 选项传递给 bash 来完成。也许尝试先将命令字符串保存到文件中,然后将其传递给 bash,例如 here。这样干净多了。您还可以检查文件是否有错误。
猜你喜欢
  • 2013-02-07
  • 1970-01-01
  • 1970-01-01
  • 2010-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多