Почему pkill убивает мою сессию SSH?
Я хочу сделать что-то вроде этого:
program='java'
ssh bob@mycomputer "pkill -f $program; echo 'Done!'";
Но, похоже, pkill
убивает мой SSH (я никогда не вижу Done!
). Если я заменю pkill
с чем-то еще (скажем pwd
), работает как положено.
2 ответа
Ну, кажется, действительно хороший случай здесь. -f
Флаг использует полный путь терминала и, если он не может получить процесс, он убивает все процессы, которые ему нравятся. pkill -f /
который включает в себя SSH. Обратитесь сюда.
Если вы попробуете pkill без -f
тогда это работает. Вы также можете проверить ssh verbose (ssh -v), чтобы увидеть, что происходит в фоновом режиме.
Надеюсь, поможет.
Выбранный ответ неверен, если не находит соответствующий процесс, он ничего не убивает.
Настоящая проблема заключается в том, что когда вы связываете 2+ команды (либо с;
или&&
),pkill -f
совпадает с связанной командой и убивает ее. Вы можете проверить это поведение с помощьюpgrep
:
> ssh bob@mycomputer 'pgrep -f <random_string>'
> ssh bob@mycomputer 'pgrep -f <random_string> ; echo foo'
<chained_command_pid>
foo
Связанная команда в этом случае будет$SHELL -c pgrep -f <random_string> ; echo foo
(вы можете добавить сон в цепочку и посмотреть его на удаленной машине).