Назад | Перейти на главную страницу

Как получить последний PID, когда последний процесс породил дочерний элемент и завершился?

я начинаю ssh -S mysocket example.com соединить example.com. Если мое соединение зависает, мне нужно kill этот процесс:

ssh -S mysocket example.com -N -L 1234:localhost:1234 &
last_pid=$!

...(do something blocker)

kill $last_pid 

Но это не работает. Если last_pid является XXXX, когда я проверяю реальный процесс с помощью ps -ef | grep ssh, pid процесса кажется XXXX + 1.

Которое значит что ssh -S socket запускается в фоновом режиме, порождает дочерний элемент и завершается.

Как в этом случае захватить последний pid?

Да, ssh порождает процесс мультиплексора для ControlMaster если вы используете -S переключатель. Нет простого способа запросить этот PID напрямую ssh, но предполагая, что вы не создаете много процессов, вы можете использовать вывод ps чтобы получить PID, например

ps f | grep "ssh -S mysocket" | cut -d " " -f 1

Эта команда даст вам pid мастера:

ssh -S mysocket -O check example.com

Вы также можете использовать:

pgrep --full --exact "ssh -S mysocket example.com -N -L 1234:localhost:1234"