Как запустить команду в фоновом режиме и не получить результата?

111

Я написал два сценария оболочки a.shи b.sh. У меня a.shи у b.shменя есть бесконечный цикл for, и они выводят какой-то вывод на терминал. Я хочу написать другой сценарий, который вызывает оба a.shи, b.shно я хочу, чтобы пользователь немедленно восстановил контроль над терминалом, вместо того, чтобы сценарий запускался бесконечно, и я хочу скрыть вывод в терминале.

Бехнам Сафари
источник

Ответы:

222

Используйте, nohupесли ваша фоновая работа требует много времени для завершения или вы просто используете SecureCRT или что-то в этом роде, войдите на сервер.

Перенаправьте stdout и stderr на, /dev/nullчтобы игнорировать вывод.

nohup /path/to/your/script.sh > /dev/null 2>&1 &
Джордж
источник
Чтобы добавить, иногда для сценариев есть аргументы, тогда указанная выше команда вернет неоднозначное перенаправление вывода .
sabertooth1990
Лучший способ, который я нашел, - это использовать nohup /path/to/your/script.sh parameter1 > & 1 &Если кто-нибудь знает лучший способ.
sabertooth1990 06
18
Вам это не нужно, /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
33

Перенаправьте вывод в такой файл:

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

Это перенаправит как stdout, так и stderr в один и тот же файл. Если вы хотите перенаправить stdout и stderr в два разных файла, используйте это:

./a.sh > stdoutfile 2> stderrfile &

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

Подробную информацию о перенаправлениях см. На странице руководства bash .

Адам Зальцман
источник
23

Извините, это немного поздно, но мы нашли идеальное решение для некоторых команд, где вам не нужен стандартный вывод или вывод ошибок (кредит, где он должен: http://felixmilea.com/2014/12/running-bash-commands-background -правильно / )

Это перенаправляет вывод на null и сохраняет экран чистым:

command &>/dev/null &
DanteAlighieri
источник
2
Примечание: команда будет завершена при закрытии терминала.
Banana
1
Для тех, кто смотрит на это в будущем, кто хочет, чтобы команды продолжали работать после завершения сеанса, я бы предложил screen или tmux. Они существенно запускают «сеанс в рамках сеанса», который продолжается после закрытия первоначального сеанса. Затем вы можете повторно подключиться к текущему сеансу, если снова войдете в систему. Отлично подходит для выполнения резервного копирования rsync, например, когда синхронизация должна выполняться в течение длительного времени, и вы не хотите оставлять сеанс запущенным.
DanteAlighieri
13

Если они находятся в том же каталоге, что и ваш скрипт, содержащий:

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

В &конце - это то, что заставляет ваш скрипт работать в фоновом режиме.

Эта > /dev/null 2>&1часть не обязательна - она ​​перенаправляет потоки stdout и stderr, поэтому вам не нужно видеть их на терминале, что вы, возможно, захотите сделать для шумных скриптов с большим количеством вывода.

Майкл Чинен
источник
7

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

(&>/dev/null script.sh &)
Том Хейл
источник
Это единственный ответ, который также не печатает журналы фоновых заданий в качестве [1] + 54765 done <emacs>благодарности
Альпер,
2

Если вы хотите запустить скрипт в кикстарте Linux, вам нужно запустить его, как показано ниже.

sh /tmp/script.sh > /dev/null 2>&1 < /dev/null &
САРАТ ЧАНДРАН
источник
1
nohup sh -x runShellScripts.sh &
Вакуар Хан
источник
что -xделать?
alper
0

Эти примеры работают нормально:

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

Для цикла вы можете использовать это так:

для i в {1..10}; делать sh prog.sh; сон 1; готово prog.log 2> & 1 &

Он работает в фоновом режиме и не показывает никаких результатов.

Рамин Исмаиллы
источник