我的命令是
putty.exe -ssh -P 6969 -l root -pw 123 -m D:\demo.txt 10.159.106.194
demo.txt 中的内容是
tail -f /root/config.ini > /dev/null
我运行这个 cmd 并在 linux 中检查进程状态是 ps -ef:
UID PID PPID C STIME TTY TIME CMD
root 68947 1 0 11:02 ? 00:00:00 bash -c tail -f /root/config.ini > /dev/null
root 68970 68947 0 11:02 ? 00:00:00 tail -f /root/config.ini
tail cmd 仍在运行,我该如何解决这个问题?
然后我尝试将我的 demo.txt 更改为以下内容,但没有成功:
#!/bin/bash
function sleepH(){
local sshd_pid=$(ps -p $$ -o ppid | tail -n 1)
while true
do
if [[ `ps -p $$ -o ppid | tail -n 1` != $sshd_pid ]];then kill -HUP $$;fi;
sleep 2
done
}
sleepH &
tail -f /root/config.ini >/dev/null
它将在后台运行一个函数来判断 sshd 是否关闭,当 $$ 的父 ID 发生变化时,比如 sshd close,它会运行 kill -HUP $$,但它不起作用。当我运行 putty 时,ps -ef :
UID PID PPID C STIME TTY TIME CMD
root 70324 1 0 12:45 ? 00:00:00 sshd: root@notty
root 70327 70324 0 12:45 ? 00:00:00 bash -c #!/bin/bash function sleepH(){ ?local sshd_pid=$(ps -p $$ -o ppid | tail -n 1) ?while true ?do ??if [[ `ps -p $$ -o ppid | tail -n 1` != $sshd_pid ]];t
root 70350 70327 0 12:45 ? 00:00:00 bash -c #!/bin/bash function sleepH(){ ?local sshd_pid=$(ps -p $$ -o ppid | tail -n 1) ?while true ?do ??if [[ `ps -p $$ -o ppid | tail -n 1` != $sshd_pid ]];t
root 70351 70327 0 12:45 ? 00:00:00 tail -f /root/config.ini
当我关闭 putty 时,它将变成 ps -ef :
UID PID PPID C STIME TTY TIME CMD
root 70350 1 0 12:45 ? 00:00:00 bash -c #!/bin/bash function sleepH(){ ?local sshd_pid=$(ps -p $$ -o ppid | tail -n 1) ?while true ?do ??if [[ `ps -p $$ -o ppid | tail -n 1` != $sshd_pid ]];t
root 70351 1 0 12:45 ? 00:00:00 tail -f /root/config.ini
root 70387 70350 0 12:45 ? 00:00:00 sleep 2
我感到很困惑....
我觉得我找到原因了,putty 的进程不是 pts ,通常每个进程都有自己的 tty,当终端退出时,所有属于这个 tty 的进程都会被杀死。但是由于 putty 的 ssh 不是 pts ,所以它退出后进程也不会退出。
答案1
问题与为什么在终止 ssh 会话后我的远程进程仍在运行?。答案也是。
通过简单地强制使用 PuTTY 终止伪 TTY -t
,服务器端的命令就会结束。
PuTTY 伪终端的讨论见PuTTY:如何正确模拟 -t 选项。但是,此讨论无法识别-m
您使用的选项。这导致 PuTTY 的行为有所不同。
答案2
只需添加-t选项即可解决这个问题