Виконайте команду, не змушуючи мене чекати


145

У CLI іноді команда, яку я набираю, потребує певного часу, а іноді я знаю, коли це станеться. Я трохи заплутався в "фоновому режимі" і подібному в Linux.

Що є найпоширенішим (або зручним для користувачів способом) сказати CLI, що я не хочу чекати, будь ласка, негайно поверніть мені своє запит. І якби це могло дати мені планку прогресу або просто зайнятий спінер, це було б чудово!


3
Див. Також Як ви надсилаєте програми командного рядка безпосередньо на задній план? якщо ви вже запустили команду і хочете відправити її на другий план.
Жиль

Відповіді:


153

Перед запуском команди можна додати &до командного рядка для запуску у фоновому режимі:

long-running-command &

Після запуску команди, ви можете натиснути, CtrlZщоб призупинити її, а потім bgвикласти її на другий план:

long-running-command
[Ctrl+Z]
bg

Я використав команду "find ~ / a.java &", але я не пішов у фоновому режимі? Крім того, я спробував cmd + z (для mac) .... це не працює
Абхіманья Арій

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

31

Це, мабуть, те, що ви хочете

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!). Не роблячи цього, вихід буде прямим до вашої оболонки, змішуючись з будь-яким іншим виходом, який у вас може бути.

Виділення фону також не вдасться, якщо ви виконуєте довгу команду та виходите з системи, або відключаєтесь. Система вб'є вашу роботу.

Якщо ви не знайомі ні з екраном, ні з tmux, вони в основному дозволяють вам повністю відірватися від оболонки. Замість того, щоб фоновувати програму, ви фонуєте всю оболонку. Потім ви можете переключитися на нього пізніше, навіть з іншого комп’ютера. Вони обидва мають ще багато функцій, які можуть вам і не здатись корисними за межами цього випадку використання.

Екран - стара перевірена і справжня програма; tmux набагато молодший, але він дізнався з минулого екрану.


Ця відповідь пропускає фактичну відповідь і звучить як RTFM.
Льоекі

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.