Просто используйте time
когда Вы называете сценарий:
time yourscript.sh
Вы перепутываете два различных случая:
foo ; bar
будет выполнять нечто, ожидать его, чтобы закончить и затем управлять баромfoo & bar
запустит нечто, поместит его в фон и запустит панель непосредственно впоследствии.Необходимо решить, или использовать тот или другой. Вы не можете сделать обоих.;)
Для решения Вас проблема можно просто выполнить все задания в фоне и затем использовать job
перечислять pids:
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:~$
Вам также не обязательно нужен pids для отправки сигналов уничтожения. Например, kill %1
уничтожит первый фоновый процесс.
&;
является всегда неправильным. Если Вы хотите выполнить вещи в фоновом режиме в компактной остроте, опустите''; полностью и просто используйте &
между командами.
for i in ./*; do my_command "$i" & done
Другие уже объяснили почему &;
сбои. Я хотел t =o, указывают, что 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)