我有一个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。
答案 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
更不容易出错。