Навіщо запускати команду оболонки Linux за допомогою "&"?


30

Я використовую Red Hat Linux Enterprise версії 5. Я помітив, що люди іноді виконують команди з кількома &параметрами. Наприклад, у нижченаведеній команді є два &знаки. Яке їх призначення? Чи завжди вони використовуються разом з ногупом?

nohup foo.sh <script parameters> >& <log_file_name> &

Відповіді:


15

Окрім відповідей Мартіна, Еша та Кевіна, іноді ви побачите амперсанд, використаний математично для розрядних І * :

$ echo $(( 11 & 7 ))
3

Якщо ви не знайомі з бітовими операторами:

11: 1011
 7: 0111
-------- AND
 3: 0011

У кожній позиції є по одному біту першого числа І другого числа, встановіть цей біт на один у відповіді.

* Функція у відповідь Кевіна згадується як логічне AND.

Щоб уточнити відповідь Еша, коли амперсанд може використовуватись для перенаправлення, він може сказати оболонці скопіювати дескриптор файлу. У цій команді echo "hello" > outputfile 2>&1ampersand викликає будь-який вихід, який може перейти до стандартної помилки (stderr, дескриптор файлу 2), перейти до того ж місця, що і стандартний вихід (stdout, дескриптор файлу 1, за замовчуванням для лівої частини >). >& outputfileОператор обраховувати для > outputfile 2>&1.

Крім того , новий в Bash 4, є два нові термінаторів для положень в caseкоманді ;&і ;;&які впливають на «провалюється» Інша справа , і якщо так, чи виконується наступне випробування.


Класно, Деннісе! Припустимо, я використовую журнал терміналів ssh в машині, потім використовую термін ssh для виконання команди (припустимо, тривалий процес), то якщо я завершу сеанс терміналу, то тривалий процес команди буде завершений правильно? І якщо я хочу, щоб команда продовжувала виконуватись, навіть якщо я вийшов з оболонки, чи повинен я використовувати nohup, або & (в кінці команди) або використовуючи і nohup, і &?
George2

1
@ George2: Ні, >& filenameвиводить і stdout, і stderr в один і той же файл. Якщо ви хочете лише перенаправити stderr (і залишити stdout в спокої), ви зробите це 2> filename. Що стосується вашого іншого запитання, швидше за все, ви будете використовувати і те, nohupі &.
Призупинено до подальшого повідомлення.

1
@ George2: Якщо ви не працюєте з командою, ви не отримаєте відповідне повідомлення про оболонку, щоб ви могли створити команду logoutабо exitкоманду.
Призупинено до подальшого повідомлення.

2
Джордж: Якщо ви не використовуєте &, ви ніколи не повернетесь до вашого запиту, щоб зробити щось інше. Термінал буде «підвішений» до тих пір, поки процес (що б він не був) закінчився або не припинився / загине. & Гарантує, що процес працює у фоновому режимі. Однак якщо ви вийдете з системи, операційна система припинить усі ваші процеси, що також вбиває ваш фоновий процес. Якщо ви використовуєте nohup, ви говорите процесу «ігноруйте команду, яка вас припинить».
Мартін Марконніні

1
@ George2: Так. "несприйнятливий до зависань" == "процес тривати" та "не-tty" == "вийти з сеансу на консольній терміналі"
Призупинено до подальшого повідомлення.

32

У сценарії оболонки Bash ampersand "&" використовується для розщеплення процесів:

find -name hello &

Це призведе до того, що команда find буде роздвоєна та запущена у фоновому режимі (її завжди можна вбити за допомогою її PID).


Дякую Мартін, припустимо, я використовую sh-термінальний журнал у машині, потім використовую ssh-термінал для виконання команди (припустимо, тривалий процес), тоді, якщо я закрию сеанс терміналу, тоді тривалий процес команди буде завершений правильним ? І якщо я виконую команду за допомогою & in ssh-терміналу, навіть якщо я вийшов з терміналу, тривалий процес команди все ще працює, правильно?
Джордж2

1
Це правильно Джордж. Фонові процеси повинні тривати до тих пір, поки вони не вийдуть з них або не вб'єте їх. Однак, як уже було зазначено, вам не знадобиться ногуп, щоб уникнути процесу загибелі, коли користувач вийде з системи.
Мартін Марконніні

Дякую Мартине! Я хочу знати, чому нам потрібно використовувати і &, і nohup, і які їхні окремі функції змушують нас досягти мети - дозволити команді продовжувати працювати, навіть якщо термінальна консоль виходить з ладу. Я читаю сторінку man для nohup, і в ній згадується "запустити команду, захищену від зависання, з виведенням на non-tty", я збентежений, чи захищений від зависань те, що ви маєте на увазі, щоб дозволити команді продовжувати працювати без впливу виходу термінальна консоль? Якщо це так, я думаю, що використання nohup достатньо, і не потрібно використовувати &. Будь-які коментарі?
Джордж2

1
Вам потрібно використовувати обидва, якщо ви не використовуєте &, термінал не дозволить вам вводити інші команди. Найкращий спосіб вам це побачити - це просто спробувати. Хороший приклад - команда, яка займає деякий час, як-от знаходьте: find -name SomeName /> somefile.txt спробуйте це з nohup та & і побачити відмінності.
Мартін Маркончіні

Це чудова відповідь на питання про nohup
joshperry

26

Навіщо запускати команду оболонки Linux за допомогою "&"?

Щоб негайно повернути своє запит і запустити процес у фоновому режимі.

Яка функція у них?

nohup дозволяє фоновому процесу продовжувати працювати навіть після того, як користувач вийде (або вийшов із ініціюючої оболонки).

> & перенаправляє як стандартний вихід, так і стандартну помилку у файл журналу.

& запускає всю справу у фоновому режимі, одразу повертаючи вас.

Пояснення:

Кожен процес Linux відкриває три канали вводу / виводу, вхід "stdin", стандартний вихід "stdout" та стандартний вихід помилок "stderr". Їх можна використовувати для двійкових, але вони традиційно є текстовими. Коли більшість програм бачать stdin близько, вони виходять (це може змінити програміст).

Коли вихідна оболонка виходить, stdin закривається на дітей, і (часто, як правило) діти також виходять. Крім того, діти отримують програмний сигнал SIGHUP, який вказує, що користувач "повісив трубку" (раніше модем), і за замовчуванням тут також потрібно вийти. (Зверніть увагу, програміст може змінити все це під час написання програми).

Отже, те, що робить Nohup - це дати дитині обробляти окреме середовище вводу / виводу, прив’язуючи входи та виходи до чогось, що не пов'язане з батьківською оболонкою, і захищати дитину від сигналу SIGHUP. Після того як користувач відключиться, ви побачите фоновий процес nohup, що належить init (процес 1), а не оболонку користувача.

Однак робота nohupне може повністю виконати, якщо процес запускається на передньому плані, тому &використовується для запуску програми у фоновому режимі, де вона може радісно працювати з користувачем або без нього.


Припустимо, я використовую журнал терміналів ssh в машині, потім використовую термін ssh для виконання команди (припустимо, тривалий процес), то якщо я завершу сеанс терміналу, то тривалий процес команди буде завершений правильно? І якщо я хочу, щоб команда продовжувала виконуватись, навіть якщо я вийшов з оболонки, чи повинен я використовувати nohup, або & (в кінці команди) або використовуючи і nohup, і &?
Джордж2

1
Правильно, використовуйте і nohup, і & для продовження процесу після відключення SSH.
кмарш

Дякую Кмарш! Я хочу знати, чому нам потрібно використовувати і &, і nohup, і які їхні окремі функції змушують нас досягти мети - дозволити команді продовжувати працювати, навіть якщо термінальна консоль виходить з ладу. Я читаю сторінку man для nohup, і в ній згадується "запустити команду, захищену від зависання, з виведенням на non-tty", я збентежений, чи захищений від зависань те, що ви маєте на увазі, щоб дозволити команді продовжувати працювати без впливу виходу термінальна консоль? Якщо це так, я думаю, що використання nohup достатньо, і не потрібно використовувати &. Будь-які коментарі?
Джордж2

1
Я відредагую свою відповідь, щоб відповісти.
kmarsh

13

На додаток до відповіді @ Martin: Інше використання ampersand ( >&як зазначено вище) полягає у захопленні і stdoutта, і stderr. Зазвичай, якщо ви перенаправили вихід до файлу лише з ">", ви отримаєте лише вихід stdout, пропускаючи помилки.


1. Дякую Еш, я хочу підтвердити з вами, що "> & <ім'я файлу журналу>" буде скидати всі stderr і stdout у файл журналу, правильно? 2. І за допомогою "> <ім'я файлу журналу>" викине всі stdout у файл журналу, правильно?
Джордж2

1
@George: Так, саме так.
Еш

Дякую Еш! Я хочу знати, чому нам потрібно використовувати і &, і nohup, і які їхні окремі функції змушують нас досягти мети - дозволити команді продовжувати працювати, навіть якщо термінальна консоль виходить з ладу. Я читаю сторінку man для nohup, і в ній згадується "запустити команду, захищену від зависання, з виведенням на non-tty", я збентежений, чи захищений від зависань те, що ви маєте на увазі, щоб дозволити команді продовжувати працювати без впливу виходу термінальна консоль? Якщо це так, я думаю, що використання nohup достатньо, і не потрібно використовувати &. Будь-які коментарі?
George2

4

Окрім відповіді Мартіна та Еша, іноді ви можете побачити використання &&лексеми. Це використовується для того, щоб сказати "запустити другу команду, якщо і лише в тому випадку, якщо перша команда виконана успішно". Добре написана команда не матиме успішного виходу, якщо у неї є помилки.

[kevin@box ~]$ ls file && echo removing file && rm file
ls: file: No such file or directory
[kevin@box ~]$ touch file
[kevin@box ~]$ ls file && echo removing file && rm file
file
removing file
[kevin@box ~]$

Класно, Кевін! Припустимо, я використовую журнал терміналів ssh в машині, потім використовую ssh-термінал для виконання команди (припустимо, тривалий процес), то якщо я закрию сеанс терміналу, то тривалий процес команди буде завершений правильним? І якщо я хочу, щоб команда продовжувала виконуватись, навіть якщо я вийшов з оболонки, чи повинен я використовувати nohup, або & (в кінці команди) або використовуючи і nohup, і &?
Джордж2

Будь-хто працював би. NOHUP - це був оригінальний спосіб зробити це, я думаю (але я повністю здогадуюсь), але фон працює зараз. Важлива відмінність полягає у запуску інтерактивної оболонки шляхом передачі в віддалену систему. Процес NOHUP запускатиметься на передньому плані, але продовжує працювати, якщо ви вийдете, тоді як фоновий процес повернеться одразу після того, як ви поробили команду. Але коли ви намагаєтеся вийти з інтерактивної оболонки з командою, що працює у фоновому режимі, вас попереджають попередньо.
Кевін М

2

Відповідь Мартіна хороша, але трохи неоднозначна. Команда завжди розщеплена і виконана, але нормальна поведінка оболонки - чекати на команду, поки вона не завершиться. "Амперсанд" відкладає його на другий план, щоб ви повернули своє термінальне запитання назад і можете робити інші речі. Якщо процес випхає дані в stdout або stderr, це буде змішано з тим, що ви робите під час запиту, і може заплутати вас. Ось чому ви переспрямовуєте потім за допомогою & &pp/to/logfile.txt.

У відповідь на George2, звичайна поведінка для оболонки, що виходить, полягає в надсиланні сигналу SIGHUP всім процесам в одній і тій же групі процесів (по суті речі, які ви породили), і вони зазвичай припиняються. Якщо ви хочете, щоб це продовжувалося, навіть якщо ви закрили процес оболонки, ви можете скористатися командою nohup, щоб змусити їх ігнорувати цей сигнал і продовжувати працювати. Існує особлива назва цього типу процесу, він називається демоновим процесом (вимовляється «демон»).


Дякую Річ! Припустимо, я використовую журнал терміналів ssh в машині, потім використовую ssh-термінал для виконання команди (припустимо, тривалий процес), то якщо я закрию сеанс терміналу, то тривалий процес команди буде завершений правильним? І якщо я хочу, щоб команда продовжувала виконуватись, навіть якщо я вийшов з оболонки, чи повинен я використовувати nohup, або & (в кінці команди) або використовуючи і nohup, і &? І чому?
Джордж2

Гей, Джордж, вибач, що я реагую так пізно. Так, якщо ви вийдете з оболонки, тривалий процес буде припинено. Якщо ви хочете, щоб це продовжувалося, вам потрібно зробити як нохуп (щоб не припинялося, коли оболонка закривається), так і & (поставити на задній план, щоб ви могли Crtl-D або вийти з оболонки). Ви також можете переглянути команду setid, яка дозволить запустити ваш процес, ігноруючи SIGHUP трохи іншим способом.
Багата Гомолка

Чудова відповідь, пояснює кращі практики для запущених фонових процесів оболонок.
Марсель Вальдес Ороско
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.