Putty点击关闭按钮后会继续运行其他进程,如何自动杀死它们

Putty点击关闭按钮后会继续运行其他进程,如何自动杀死它们

我的命令是

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选项即可解决这个问题

相关内容