Выполнить серию команд независимо друг от друга

Выполнить серию команд независимо друг от друга

Если у меня есть файл с

cmd1

cmd2

cmd3

И я хочу запускать их независимо друг от друга и независимо от того, выводится ли статус завершения или нет (это значит, не ожидать завершения, а просто продолжать запускать процессы, которые могут завершиться ошибкой или нет). Я знаю, что это ;запустит следующую команду, но это не так, потому что она ждет, пока предыдущая команда либо не завершится ошибкой, либо успешно. Я хочу запустить все команды одновременно.

Это что-то вроде sleep 60m; а затем проигрывать музыку, звенеть колокольчиком, запускать браузер, но, очевидно, нет способа дождаться, пока заиграет музыка, чтобы зазвенел звонок, а затем после этого запустить браузер. Это должно произойти сразу.

ДОБАВЛЕНО: как, например,

прочитать строки из файла, открыть терминал для каждой строки и запустить его?

решение1

Простое добавление амперсанда в конец каждой строки переведет все команды в фоновый режим.

cmd1 &
cmd2 &
cmd3 &

Пример

$ more at_once.bash 
#!/bin/bash

echo "1" && sleep 10 &
echo "2" && sleep 10 &
echo "3" && sleep 10 &
pgrep -a sleep

Теперь, когда мы запустим этот скрипт:

$ ./at_once.bash 
1
3
2
7533 sleep 10
7535 sleep 10
7536 sleep 10

Вы даже можете видеть, что задачи были запущены не по порядку из-за их фоновой природы, когда 3-я команда была отображена раньше 2-й. Это pgrep sleepпоказывает, что все 3 фоновые команды выполняются одновременно.

ПРИМЕЧАНИЕ:Я использовал нотацию echo "X" && sleep 10просто для того, чтобы показать, что команды выполнялись в фоновом режиме. Эта нотация не имеет ничего общего с самим фоновым режимом, завершающий элемент &— это то, что «переводит» sleep 10команды в фоновый режим.

Вы также можете использовать &в качестве разделителя, если предпочитаете сделать это в одной командной строке:

$ sleep 10 & sleep 10 & sleep 10 &
[1] 7731
[2] 7732
[3] 7733

Проверяю вот эту строчку:

$ pgrep -a sleep
7731 sleep 10
7732 sleep 10
7733 sleep 10

Опять же, мы видим, что все они работают одновременно. Если бы вы использовали точку с запятой:

$ sleep 10 ; sleep 10 ; sleep 10

Команды sleep 10будут выполняться последовательно, и на их выполнение уйдет 30 секунд, а не параллельно, и на их выполнение уйдет всего 10 секунд.

Связанный контент