Estaba probando la siguiente combinación para obtener el pid de la sesión ssh (la ejecución en segundo plano muestra el pid) y luego fg para volver a la sesión ssh e introducir la contraseña:
ssh targetHost &; fg
Obtuve el siguiente error:
-bash: syntax error near unexpected token `;'
¿Por qué el ";" ¿No funciona como se esperaba en este caso?
Mi objetivo es iniciar una sesión ssh y conocer su pid y necesito hacerlo en la menor cantidad de líneas posible. Necesito iniciar varias sesiones ssh, ponerlas en segundo plano y al final finalizarlas; por eso necesito los pids.
Respuesta1
Estás mezclando dos casos diferentes:
foo ; bar
ejecutará foo, esperará a que termine y luego ejecutará barfoo & bar
iniciará foo, lo pondrá en segundo plano e iniciará la barra inmediatamente después.
Tienes que decidir si usas uno u otro. No puedes hacer ambas cosas. ;)
Para resolver su problema, simplemente puede ejecutar todos los trabajos en segundo plano y luego usarlos job
para enumerar los 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:~$
Tampoco es necesario que los pids envíen señales de muerte. Por ejemplo, kill %1
eliminará el primer proceso en segundo plano.
Respuesta2
&;
siempre está mal. Si desea ejecutar cosas en segundo plano en una sola línea compacta, omita el ';' uso completo y sencillo &
entre comandos.
for i in ./*; do my_command "$i" & done
Respuesta3
Otros ya han explicado por qué &;
falla. Quería señalar que el PID del último proceso en segundo plano se guarda como $!
. Por lo tanto, siempre puedes acceder al PID del último comando:
ssh targetHost & echo $!; fg
En cuanto a matarlos, puedes matar todas ssh
las sesiones con este comando:
pkill -x ssh
Las x
causas pkill
y pgrep
para que coincidan con el nombre completo del comando, esto garantiza que no matará sshd
o ssh-agent
. Si solo desea eliminar las conexiones a una máquina específica, también puede hacer esto:
pkill $(pgrep -alx ssh | grep TARGET_IP | cut -d ' ' -f 1)