通过 ssh 执行脚本并将其 pid 存储在远程机器上的文件中
Execute a script through ssh and store its pid in a file on the remote machine
当 运行 通过 ssh 在后台运行脚本时,我无法在远程计算机上的文件中存储任何 PID
。
我需要将脚本进程的 PID
存储在一个文件中,以便在需要时将其终止。当 运行 它在远程机器上运行的确切命令时,为什么通过 ssh 它不起作用?
以下命令有什么问题:
ssh user@remote_machine "nohup ./script.sh > /dev/null 2>&1 & echo $! > ./pid.log"
结果:文件 pid.log
已创建但为空。
预期:文件 pid.log
应包含 运行 脚本的 PID
。
使用
ssh user@remote_machine 'nohup ./script.sh > /dev/null 2>&1 & echo $! > ./pid.log'
或
ssh user@remote_machine "nohup ./script.sh > /dev/null 2>&1 & echo $! > ./pid.log"
问题:
Your $!
was getting expanded locally, before calling ssh at all.
更糟糕的是,在调用 ssh 命令之前,如果有一个进程在后台启动,那么 $!
将扩展到该进程,并且完整的 ssh 命令将扩展为包含该 PID 作为 echo 的参数.
例如
$ ls &
[12342] <~~~~ This is the PID of ls
$ <~~~~ Prompt returns immediately because ls was stared in background.
myfile1 myfile2 <~~~~ Output of ls.
[1]+ Done ls
#### At this point, $! contains 12342
$ ssh user@remote "command & echo $! > pidfile"
# before even calling ssh, shell internally expands it to:
$ ssh user@remote "command & echo 12342 > pidfile"
而且它会在 pid 文件中放入错误的 PID。
当 运行 通过 ssh 在后台运行脚本时,我无法在远程计算机上的文件中存储任何 PID
。
我需要将脚本进程的 PID
存储在一个文件中,以便在需要时将其终止。当 运行 它在远程机器上运行的确切命令时,为什么通过 ssh 它不起作用?
以下命令有什么问题:
ssh user@remote_machine "nohup ./script.sh > /dev/null 2>&1 & echo $! > ./pid.log"
结果:文件 pid.log
已创建但为空。
预期:文件 pid.log
应包含 运行 脚本的 PID
。
使用
ssh user@remote_machine 'nohup ./script.sh > /dev/null 2>&1 & echo $! > ./pid.log'
或
ssh user@remote_machine "nohup ./script.sh > /dev/null 2>&1 & echo $! > ./pid.log"
问题:
Your $!
was getting expanded locally, before calling ssh at all.
更糟糕的是,在调用 ssh 命令之前,如果有一个进程在后台启动,那么 $!
将扩展到该进程,并且完整的 ssh 命令将扩展为包含该 PID 作为 echo 的参数.
例如
$ ls &
[12342] <~~~~ This is the PID of ls
$ <~~~~ Prompt returns immediately because ls was stared in background.
myfile1 myfile2 <~~~~ Output of ls.
[1]+ Done ls
#### At this point, $! contains 12342
$ ssh user@remote "command & echo $! > pidfile"
# before even calling ssh, shell internally expands it to:
$ ssh user@remote "command & echo 12342 > pidfile"
而且它会在 pid 文件中放入错误的 PID。