Як запустити скрипт оболонки у фоновому режимі і не отримати вихід


111

Я написав два сценарії оболонки a.shі b.sh. В a.shі у b.shмене є нескінченний для циклу і вони друкують деякий висновок на термінал. Я хочу написати інший сценарій, який викликає і те, a.shі інше, b.shале я хочу, щоб користувач негайно відновив контроль над терміналом, замість того, щоб сценарій виконувався нескінченно, і я хочу приховати вихід у терміналі.

Відповіді:


220

Використовуйте, nohupякщо ваше фонове завдання займає багато часу, або ви просто використовуєте SecureCRT або щось подібне, щоб увійти на сервер.

Перенаправити стандартний висновок і стандартний висновок для /dev/nullігнорувати висновок.

nohup /path/to/your/script.sh > /dev/null 2>&1 &

Додамо, що іноді є аргументи для скриптів, тоді вищевказана команда поверне неоднозначне перенаправлення виводу .
sabertooth1990

Кращий спосіб, який я знайшов - це використовувати, nohup /path/to/your/script.sh parameter1 > & 1 &якщо хтось знає кращий спосіб.
sabertooth1990

17
Вам не потрібно, /dev/null 2>&1якщо ви використовуєте, nohupоскільки він автоматично додає всі потоки STDOUT та STDERR до файлу nohup.out автоматично. Використовуйте просто:nohup /path/to/your/command &
Леонардо

1
@ sabertooth1990 Ваш командний рядок несправний:-bash: syntax error near unexpected token '&'
notes-jj

1
Як би ви тоді вбили створений процес?
Alexis_A

32

Перенаправити вихід на такий файл:

./a.sh > somefile 2>&1 &

Це перенаправить і stdout, і stderr в один і той же файл. Якщо ви хочете перенаправити stdout та stderr до двох різних файлів, скористайтеся цим:

./a.sh > stdoutfile 2> stderrfile &

Ви можете використовувати /dev/nullяк один, так і обидва файли, якщо вам не важливо stdout та / або stderr.

Див Баша довідкової сторінки для отримання докладної інформації про перенаправлення.


23

Вибачте, це трохи пізно, але знайшли ідеальне рішення для декількох команд, де ви не хочете отримати стандартного або помилкового виводу (кредит, якщо це пов’язано: http://felixmilea.com/2014/12/running-bash-commands-background -приблизно / )

Це перенаправляє вихід на null і зберігає екран чітким:

command &>/dev/null &

2
Примітка: команда буде припинена, коли термінал закритий.
Банан

1
Для тих, хто дивиться на це в майбутньому, хто хоче, щоб рішення тривало виконання команд після закінчення сеансу, я б запропонував екран або tmux. Вони обов'язково виконують "сеанс протягом сеансу", який продовжується після закриття початкового сеансу. Потім ви можете знову підключитися до поточного сеансу, якщо ви знову ввійдете в систему. Відмінно для запуску резервних копій rsync, наприклад, коли синхронізацію потрібно тривати довгий час, і ви не хочете залишати свій сеанс запущеним.
DanteAlighieri

13

Якщо вони перебувають у тому самому каталозі, що і ваш сценарій, який містить:

./a.sh > /dev/null 2>&1 &
./b.sh > /dev/null 2>&1 &

The &Зрештою , це те , що робить ваш сценарій запускається у фоновому режимі.

> /dev/null 2>&1Частина не потрібна - він перенаправляє стандартний висновок і стандартний потік помилок потоків , так що ви не повинні бачити їх на терміналі, який ви можете захотіти зробити для гучних сценаріїв з великою кількістю продукції.


7

Запустіть в передплаті, щоб видалити сповіщення та закрити STDOUT та STDERR:

(&>/dev/null script.sh &)

Це єдина відповідь, яка також не друкує фонові журнали завдань, як [1] + 54765 done <emacs>дякую
alper

2

Якщо ви хочете запустити скрипт у linux kickstart, вам слід виконати, як показано нижче.

sh /tmp/script.sh > /dev/null 2>&1 < /dev/null &


0

Ці приклади добре працюють:

nohup sh prog.sh proglog.log 2> & 1 &

Для циклу можна використовувати так:

для i в {1..10}; робити ш прог.ш; сон 1; зроблено prog.log 2> & 1 &

Він працює у фоновому режимі і не показує жодного результату.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.