Если у меня есть файл с
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 секунд.