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

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

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

121 голос | спросил themirror 5 ThuEurope/Moscow2013-12-05T01:23:01+04:00Europe/Moscow12bEurope/MoscowThu, 05 Dec 2013 01:23:01 +0400 2013, 01:23:01

8 ответов


134

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

long-running-command &

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

long-running-command
[Ctrl+Z]
bg
ответил Greg Hewgill 5 ThuEurope/Moscow2013-12-05T01:28:40+04:00Europe/Moscow12bEurope/MoscowThu, 05 Dec 2013 01:28:40 +0400 2013, 01:28:40
101

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

nohup command &

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

Существует еще один disown, но это скорее расширение других ответов, а сам метод:

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

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

ответил Braiam 5 ThuEurope/Moscow2013-12-05T05:19:04+04:00Europe/Moscow12bEurope/MoscowThu, 05 Dec 2013 05:19:04 +0400 2013, 05:19:04
20

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

my_command > output.log 2>&1 &

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

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

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

ответил travnik 2 12015vEurope/Moscow11bEurope/MoscowMon, 02 Nov 2015 18:43:06 +0300 2015, 18:43:06
6

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

$ tmux new -d 'longrunningcommand'

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

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

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

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

ответил yoonix 5 ThuEurope/Moscow2013-12-05T05:03:02+04:00Europe/Moscow12bEurope/MoscowThu, 05 Dec 2013 05:03:02 +0400 2013, 05:03:02
5

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

long_command with arguments > redirection &

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

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

ответил alexis 5 ThuEurope/Moscow2013-12-05T03:28:57+04:00Europe/Moscow12bEurope/MoscowThu, 05 Dec 2013 03:28:57 +0400 2013, 03:28:57
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
ответил Davidson Chua 5 ThuEurope/Moscow2013-12-05T05:29:45+04:00Europe/Moscow12bEurope/MoscowThu, 05 Dec 2013 05:29:45 +0400 2013, 05:29:45
2

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

Например:

areallylong_command &

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

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

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

ответил Ketan 5 ThuEurope/Moscow2013-12-05T01:27:45+04:00Europe/Moscow12bEurope/MoscowThu, 05 Dec 2013 01:27:45 +0400 2013, 01:27:45
0

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

ответил meaje 8 PM00000090000001031 2017, 21:44:10

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132