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


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

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


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 намного моложе, но извлек уроки из прошлого экрана.


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

5

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

long_command with arguments > redirection &

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

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


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


0

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.