获取使用 sshpass 启动的远程进程的 PID
Get PID of a remote process started with 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。
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
我有一个 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。
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