Я пробовал следующую комбинацию, чтобы получить pid сеанса ssh (запуск в фоновом режиме отображает pid), а затем fg, чтобы вернуться в сеанс ssh и ввести пароль:
ssh targetHost &; fg
Я получаю следующую ошибку:
-bash: syntax error near unexpected token `;'
Почему в этом случае «;» не работает так, как ожидалось?
Моя цель — запустить сеанс ssh и узнать его pid, и мне нужно сделать это в как можно меньшем количестве строк. Мне нужно запустить несколько сеансов ssh, перевести их в фоновый режим и в конце завершить их — вот почему мне нужны pid.
решение1
Вы смешиваете два разных случая:
foo ; bar
запустит foo, дождется его завершения и затем запустит barfoo & bar
запустит foo, переведет его в фоновый режим и сразу после этого запустит bar.
Вам нужно решить, использовать одно или другое. Вы не можете использовать оба варианта. ;)
Чтобы решить эту проблему, вы можете просто запустить все задания в фоновом режиме, а затем использовать job
для вывода списка pid:
michas@lenny:~$ sleep 10 &
[1] 18007
michas@lenny:~$ sleep 10 &
[2] 18011
michas@lenny:~$ sleep 10 &
[3] 18015
michas@lenny:~$ sleep 10 &
[4] 18019
michas@lenny:~$ sleep 10 &
[5] 18026
michas@lenny:~$ jobs -p
18007
18011
18015
18019
18026
michas@lenny:~$
Вам также не обязательно нужны pid для отправки сигналов kill. Например, kill %1
убьет первый фоновый процесс.
решение2
&;
всегда неправильно. Если вы хотите запустить что-то в фоновом режиме в компактной однострочной команде, полностью опустите ';' и просто используйте &
между командами.
for i in ./*; do my_command "$i" & done
решение3
Другие уже объяснили, почему &;
не получается. Я хотел бы отметить, что PID последнего фонового процесса сохраняется как $!
. Таким образом, вы всегда можете получить доступ к PID последней команды:
ssh targetHost & echo $!; fg
Что касается их завершения, вы можете завершить все ssh
сеансы с помощью этой команды:
pkill -x ssh
Причины и соответствуют полному имени команды, это гарантирует, что вы не убьете x
или . Если вы хотите только убивать соединения с определенной машиной, вы также можете сделать это:pkill
pgrep
sshd
ssh-agent
pkill $(pgrep -alx ssh | grep TARGET_IP | cut -d ' ' -f 1)