LINUX.ORG.RU
ФорумAdmin

Как автоматически завершить все процессы после отключения ssh

 


0

1

Выполнил команду через ssh, отключился от сервера - команда завершилась. Как сделать такое?

Как я могу находясь в ssh убить все процессы, созданные конкретным подключением? Допустим у меня 3 подключения и в одном я хочу убить все процессы, а в других не трогать ничего

Все изгуглил, думал как то по простому можно сделать, приглось писать такой скрипт, который убивает все процессы порожденные ssh сессией. Смысл такой: ищется первый родительский процесс под названием ssh - получаю его PID, далее получаю все его дочерние PIDы - и их убиваю. Как вам такой подход? Пойдет или все таки можно более лаконично сделать. Смотрел pgrep - там можно убить по определенному tty, но он в моем случае не создается. Как иначе идентифицировать процессы принадлежащие конкретной ssh сессии по не понять

#!/bin/bash

function getppid() {
  echo `ps -o ppid=  -p $1;`
}
ppid=$$

userself=`whoami`
my_sshd=""
while [ "$ppid" != "" ] && [ "$ppid" != "0" ]
do
  ppid=`ps -o ppid=  -p $ppid;`
  if [ $ppid == "0" ]; then
      break
  fi

  info=`ps -o comm= -o user= -p $ppid;`
  comm=`echo $info | cut -d" " -f1`
  user=`echo $info | cut -d" " -f2`


  if [ $userself == $user ] && [ $comm == "sshd" ] ; then
    echo "my ssh: $info"
    my_sshd=$ppid;
    break;
  fi

done

if [ "$my_sshd" != "" ]; then
  pstree  -p $my_sshd

  kill_pids=`pstree -pc $my_sshd | grep -iEo '([0-9]+)' | paste -sd " " -`

  kill_pids="${kill_pids/$$/""}"
  kill_pids="${kill_pids/$my_sshd/""}"
  #kill_pids=`pgrep -d " " --parent $my_sshd`

  if [ "$kill_pids" != "" ]; then
    echo "killing pids...$kill_pids"
    kill $kill_pids 2>/dev/null
  else
    echo "nothing kill..."
  fi

  sleep 0.1

else
  echo "my ssh session not found"
  exit 1
fi

★★★★

Последнее исправление: gobot (всего исправлений: 4)

Видимо, не использовать те средства, которые позволяют программе выполняться после отключения SSH. Потому что обычно всё завершится.

anonymous
()

Кстати почему такая команда работает

sleep2 100 & echo $!
[1] 98499
98499
bash: sleep2: command not found



Печатает pid якобы запустившегося процесса, но который не существует. 98499 - это что за процесс? Процесс - запускальщик других процессов? И как понять что процесс запустился?

gobot ★★★★
() автор топика
Ответ на: комментарий от gobot

98499 - это что за процесс?

Когда ты выполняешь команду в bash - он форкается. PID этого форка ты и получаешь. Форк смотрит на команду sleep2, говорит - нету ее и завершается. А потом уже ты пытаешься понять кому принадлежит PID 98499 :-)

Попробуй так:

(sleep 30 && sleep2) & echo $!

В течении первых 30 секунд в ps будет виден sleep 30, а потом - ничего

Pinkbyte ★★★★★
()