Этот сценарий удара для потоков параллели N. Каждым аргументом является команда.
trap
уничтожит все подпроцессы, когда SIGINT будет пойман.
wait $PID_LIST
ожидает каждый процесс для завершения. Когда все процессы завершились, выходы программы.
#!/bin/bash
for cmd in "$@"; do {
echo "Process \"$cmd\" started";
$cmd & pid=$!
PID_LIST+=" $pid";
} done
trap "kill $PID_LIST" SIGINT
echo "Parallel processes have started";
wait $PID_LIST
echo
echo "All processes have completed";
Сохраняют этот сценарий как parallel_commands
и делают это исполняемым файлом.
Это - то, как использовать этот сценарий:
parallel_commands "cmd arg0 arg1 arg2" "other_cmd arg0 arg2 arg3"
Пример:
parallel_commands "sleep 1" "sleep 2" "sleep 3" "sleep 4"
Запускаются, 4 параллели спят, и ожидает до "сна 4" конца.
На основе комментария @alessandro-pezzato. Выполненные кратные числа управляют при помощи &
между командами.
Пример:
$ sleep 3 & sleep 5 & sleep 2 &
Это, выполнит команды в фоне.
Использование Параллель GNU:
(echo command1; echo command2) | parallel
parallel ::: command1 command2
Для уничтожения:
parallel ::: command1 command2 &
PID=$!
kill -TERM $PID
kill -TERM $PID
Это может быть сделано с простым Make-файлом:
sleep%:
sleep $(subst sleep,,$@)
@echo $@ done.
опция Use -j
.
$ make -j sleep3 sleep2 sleep1
sleep 3
sleep 2
sleep 1
sleep1 done.
sleep2 done.
sleep3 done.
опция Without -j
это выполняется в сериале.
$ make -j sleep3 sleep2 sleep1
sleep 3
sleep3 done.
sleep 2
sleep2 done.
sleep 1
sleep1 done.
можно также сделать пробный прогон с '-n' опция.
$ make -j -n sleep3 sleep2 sleep1
sleep 3
sleep 2
sleep 1
Я предлагаю намного более простую утилиту, которую я просто записал. Это в настоящее время называло паритет, но будет скоро переименовано или к parl или к pll, еще не решили.
API так же прост как:
par "script1.sh" "script2.sh" "script3.sh"
команды Добавления префикса могут быть сделаны через:
par "PARPREFIX=[script1] script1.sh" "script2.sh" "script3.sh"
Для выполнения нескольких команд просто добавляют &&
между двумя командами как это: command1 && command2
И если Вы хотите выполнить их в двух различных терминалах затем, Вы делаете это как это:
gnome-terminal -e "command1" && gnome-terminal -e "command2"
Это откроет 2 терминала с command1
и command2
выполнение в них.
Hope это помогает Вам.