Запустите команду, не заставляя меня ждать

145

В CLI иногда вводимая команда занимает некоторое время, а иногда я знаю, когда это произойдет. Я немного запутался в «фоновом режиме» и тому подобном в Linux.

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

зеркало
источник
3
Смотрите также Как вы отправляете приложения командной строки прямо в фон? если вы уже запустили команду и хотите отправить ее в фоновый режим.
Жиль

Ответы:

153

Перед запуском команды вы можете добавить &в командную строку для запуска в фоновом режиме:

long-running-command &

После запуска команды вы можете нажать, CtrlZчтобы приостановить ее, а затем bgпоместить в фоновый режим:

long-running-command
[Ctrl+Z]
bg
Грег Хьюгилл
источник
Я использовал команду "найти ~ / a.java &", но я не пошел в фоновом режиме? Кроме того, я попробовал cmd + z (для Mac) .... это не работает
Abhimanyu Aryan
1
@AbhimanyuAryan, может быть, вы хотите find ...сначала отладить свою команду, а затем запустить ее в фоновом режиме. В этом случае вы упустили -nameвозможность.
Алексис Уилке
113

Это фаворит из всех, поскольку помимо отправки процесса в фоновом режиме, вам не нужно беспокоиться о том, что вывод текста портит ваш терминал:

nohup command &

Это не только запускает процесс в фоновом режиме, но также генерирует журнал (вызывается nohup.outв текущем каталоге, если это невозможно, в вашем домашнем каталоге), и если вы закрываете / завершаете работу текущей оболочки, процесс не прерывается, предотвращая получение дочернего процесса родительский сигнал при уничтожении (т. е. выход из системы с помощью SIGHUP для родителя или закрытие текущей оболочки).

Есть другие вызываемые, disownно это скорее расширение других ответов, а не метод сам по себе:

command & # our program is in background
disown # now it detached itself of the shell, you can do whatever you want

Эти команды не позволяют легко восстановить выходные данные процесса, если вы не используете хакерский способ сделать это.

Braiam
источник
4
Сисадмин с 95 года. Никогда не слышал об отречении до сегодняшнего дня, спасибо! Хотя это не работает с каждой оболочкой (проверено bash, zsh, tcsh. Tcsh не работает).
yoonix
Использование nohupв работе контроля оболочки глупо. Современные оболочки не отправляют HUPв фоновые процессы. Перенаправление на уникальное имя файла - это небольшая цена.
птенцы
@chicks вариант использования здесь, чтобы предотвратить загрязнение терминала stderr и stdout плюс то, что он автоматически создает файл журнала.
Брайам
1
command > file.log 2>&1 & disownнемного длиннее, nohup command &но я думаю, это то, что предлагал @chicks.
Joeytwiddle
32

Это, вероятно, то, что вы хотите

my_command > output.log 2>&1 &

это запустит вашу команду, перенаправив как stdout, так и stderr на некоторые, output.logкоторые вы можете указать. Если вы вообще не хотите хранить вывод - вы можете использовать /dev/nullвместо реального файла.

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

Кроме того, когда вы запускаете команду, подобную этой, вы должны получить подтверждение от ядра, похожее на это: [2] 1234 Это означает, что ваш процесс работает в фоновом режиме и его идентификатор равен 1234, так что вы можете убить его позже, если захотите сkill -9 1234

Травник
источник
2
спасибо, 2>&1очень важно, потому что команда может потерпеть неудачу и попытаться вывести ошибку в некоторых случаях!
ericn
1
Этот работал, когда вышеупомянутые ответы не благодарили.
Домагой
9

Посмотрите на экран или Tmux . Пример с tmux:

$ tmux new -d 'longrunningcommand'

В то время как другие ответы, использующие '&' для фона, будут работать, вы должны перенаправить stdout (и stderr!). Без этого вывод будет идти прямо к вашей оболочке, смешиваясь с любым другим выводом, который у вас может быть.

Фоновая обработка также не будет выполнена, если вы запускаете длинную команду и выходите из системы или отключаетесь. Система убьет вашу работу.

Если вы не знакомы ни с screen, ни с tmux, они в основном позволяют полностью отключиться от вашей оболочки. Вместо фона вашей программы вы создаете фон всей оболочки. Затем вы можете вернуться к нему позже, даже с другого компьютера. Они оба имеют гораздо больше функций, которые вы можете или не можете найти полезными за пределами этого варианта использования.

Screen - старая проверенная и проверенная программа; tmux намного моложе, но извлек уроки из прошлого экрана.

yoonix
источник
Этот ответ пропускает фактический ответ и звучит как RTFM.
Lloeki
5

(Для полноты ответа уже ответил :) Вы помещаете команду в фоновом режиме, добавляя &после команды:

long_command with arguments > redirection &

Я добавляю этот ответ для решения другой части вашего вопроса:

Нет реального эквивалента счетчика для отображения текущих фоновых команд, но вы можете увидеть статус фоновых команд, набрав jobsили jobs -l. Он покажет вам ваши фоновые команды, и будут ли они запущены, остановлены с помощью сигнала (например, с помощью ^Z) или иногда остановлены, потому что они ждут от вас интерактивного ввода.

Alexis
источник
long_command with arguments &> redirection &перенаправить stderrтоже
Ice-Blaze
3

Вы можете запустить программу в фоновом режиме, используя &. Например, если вы хотите запустить, yum install XyZнапример, вы можете запустить:

yum install XyZ &

stdoutИли выход из программы может быть перенаправлен с помощью >перезаписи файла, или >>для добавления в файл. Например, если вы хотите войти yumв файл yum.log:

yum install XyZ > yum.log &

Или, если вы хотите добавить вывод в существующий файл log:

yum install XyZ >> log &

Ошибки печатаются в stderrи не stdout, и могут быть перенаправлены в файл таким же образом, но с использованием 2>:

yum install XyZ 2> errors
yum install XyZ 2>> errors

Если вы хотите перенаправить оба stderrи stdout, вы можете использовать &>:

yum install XyZ &> output
yum install XyZ &>> output
Дэвидсон Чуа
источник
2

Вы можете запустить команду в фоновом режиме, просто поставив &знак после нее.

Например:

areallylong_command &

будет запускать его в фоновом режиме.

Вы можете также перенаправить stdout / stderr на соответствующие файлы, чтобы они не появлялись на вашем терминале, пока вы что-то делаете.

См. Это для получения дополнительной информации: http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html

MKC
источник
0

Попробуйте использовать команду 'screen' перед тем, как запустить долгосрочное задание, затем, когда вы отсоединяетесь, вы можете снова подключиться к нему с помощью 'screen -r -d' всякий раз, когда вам это понадобится снова. Я обнаружил, что при использовании терминала через ssh или другие сетевые соединения они могут иногда прерываться из-за плохого соединения с сервером. запуск его внутри «экрана» решает эту проблему.

meaje
источник