Почему 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(вы можете добавить сон в цепочку и посмотреть его на удаленной машине).

Другие вопросы по тегам