Как мне запустить программу из bash, игнорируя ее стандартный вывод, чтобы я мог запускать больше программ? [закрыто]

Используйте wait с PID, который будет:

Дождаться, пока дочерний процесс, указанный каждым идентификатором процесса pid или спецификация задания jobpec завершает работу и возвращает статус завершения последней ожидаемой команды.

Вам нужно будет сохранять PID каждого процесса по мере продвижения:

echo "x" & X=$!
echo "y" & Y=$!
echo "z" & Z=$!

Вы также можете включить управление заданиями в сценарии с помощью set -m и использовать % n jobspec, но вы почти наверняка не захотите - управление заданиями имеет множество других побочных эффектов .

wait вернет тот же код, что и завершенный процесс. Вы можете использовать wait $ X в любой (разумный) более поздний момент, чтобы получить доступ к окончательному коду как $? или просто использовать его как истину / ложь:

echo "x" & X=$!
echo "y" & Y=$!
...
wait $X
echo "job X returned $?"

wait будет сделайте паузу, пока команда не завершится, если это еще не сделано.

Если вы хотите избежать подобного зависания, вы можете установить ловушку на SIGCHLD , подсчитать количество завершений и обработать все wait сразу, когда они все закончат. Вам, вероятно, удастся почти все время использовать только wait .

1
03.07.2017, 15:58
6 ответов

Я полагаю, что вы ищете команду setsid, которая запускает программу в новом сеансе. Итак, вы можете:

setsid apt-get update

И, если вы хотите, чтобы apt-get updateмолчал:

setsid apt-get update >/dev/null 2>&1

Хорошая вещь с setsidзаключается в том, что процесс, начатый таким образом, продолжится. после закрытия терминала.

0
27.01.2020, 23:33
nohup apt-get update > /dev/null 2> /dev/null < /dev/null & vi /some/config

https://en.wikipedia.org/wiki/Nohup#Overcoming_hanging

технически nohup подразумевает, что стандартный ввод — это /dev/null, поэтому < /dev/nullне нужен

0
27.01.2020, 23:33
apt-get update > /dev/null 2>&1 &

apt-get update— это команда, которую вы хотите запустить.

> /dev/nullпередает весь стандартный вывод в /dev/null, который по умолчанию избавляется от него. Вы можете указать файл журнала, если хотите посмотреть результат позже.

2>&1направляет stderr в stdout. Вы можете заменить &1 файлом журнала, если хотите увидеть какие-либо ошибки.

&запускает команду в фоновом режиме. Чтобы увидеть, что работает в фоновом режиме, попробуйте jobs. Если вы хотите впоследствии связать процесс с вашей оболочкой, вы можете запустить fg

. Если вы хотите, чтобы он выжил после закрытия терминала, вы можете отказатьсяот фоновых процессов.

0
27.01.2020, 23:33

"< /dev/null" считывает стандартный ввод из /dev/null — обычный перенаправленный ввод. Это немедленно возвращает EOF, т.е. чтение из пустого файла. Это полезная идиома для случаев, когда вы хотите иногда читать из STDIN, но не в этом случае.

1
27.01.2020, 23:33

Похоже, вы ищете, как запустить процесс в фоновом режиме, позволяя вам одновременно выполнять другую работу. Это достигается добавлением амперсанда в конце команды. Например, через несколько миллисекунд после запуска sleep 5hвы можете ввести другую команду, в то время как фоновая команда делает свое дело. Чтобы процесс пережил закрытие терминала, вам придется сделать его осиротевшим, используя disown, а чтобы не видеть стандартный вывод (или стандартную ошибку ), вы можете использовать перенаправления . См. управление процессами и управление заданиями для отличной документации.

В качестве альтернативы вы можете запустить команду на переднем плане и просто запустить другой терминал, чтобы сделать что-то еще. Об остальном позаботится ОС.

1
27.01.2020, 23:33

В дополнение к другим ответам (например. фоновое задание, nohup (1)и т. д. )вы можете рассмотреть возможность использованияbatch(из пакета at, который необходимо установить )с здесь документом , например

batch << ENDOFJOB
 apt-get update
 apt-get upgrade
ENDOFJOB

(для запуска команд администратора, таких как apt-get, вам может потребоваться запустить batchот имени пользователя root)

Посмотрите также в crontab (5)файлы с командой crontab (1)и в anacron (8).

Конечно, вы можете захотеть перенаправить оба stdout и stderr ваших apt-getкоманд (, которым вы, возможно, захотите передать --yes; read apt -get (8 )), возможно, используя что-то вроде
apt-get update >& /tmp/your-apt-get-update.output.

Относительно /dev/nullчитать ноль (4).

0
27.01.2020, 23:33

Теги

Похожие вопросы