Що означає "&" в кінці команди linux?


98

Я системний адміністратор, і мене попросили запустити скрипт Linux для очищення системи.

Команда така:

perl script.pl > output.log &

отже, ця команда закінчується &знаком, чи є в цьому якесь особливе значення?

Я маю базові знання оболонки, але ніколи раніше цього не бачив.


вибачте, погано, я знав про такі основні речі
Чувак

3
Якщо ви знаходитесь на цій сторінці і шукаєте різницю між &і &&: &виконує першу команду у фоновому режимі; &&виконує першу команду і умовно переходить до другої, якщо вона завершується успішно.
Девід Бодов

Відповіді:


150

Команда &робить команду запущеною у фоновому режимі.

Від man bash:

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


12

Крім того, ви можете використовувати знак "&" для запуску багатьох процесів через одне (1) з'єднання ssh, щоб зберегти мінімальну кількість терміналів. Наприклад, у мене є один процес, який прослуховує повідомлення з метою вилучення файлів, другий процес прослуховує повідомлення для завантаження файлів: Використовуючи "&" я можу запускати обидві служби в одному терміналі, через одне ssh-з'єднання зі своїм сервером .


***** Я щойно зрозумів, що ці процеси, що проходять через "&", також "залишатимуться живими" після закриття сеансу ssh! досить акуратно та корисно, якщо ваше підключення до сервера перервано **


nohupтакож підтримуватиме процеси в живих.
Джеррі Чін,

2
за допомогою & ми також можемо отримати PID, щоб ми могли припинити процес, якщо хочемо, а також перевірити стан цього процесу
Dhaval Solanki

12

Якщо не сказано інакше, команди беруть на перший план. У вас є лише один процес "переднього плану", що виконується за один сеанс оболонки. Символ & вказує командам запускатись у фоновому процесі та негайно повертається до командного рядка для отримання додаткових команд.

sh my_script.sh &

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

nohup sh my_script.sh &

EDIT: Здається, є сіра зона щодо закриття фонових процесів, коли & використовується. Тільки майте на увазі, що оболонка може закрити ваш процес залежно від вашої ОС та локальних конфігурацій (особливо на CENTOS / RHEL): https://serverfault.com/a/117157 .


2

Я точно не знаю, але я зараз читаю книгу, і я отримую те, що програма повинна обробляти свій сигнал (як коли я натискаю CTRL-C). Тепер програма може використовувати SIG_IGNігнорування всіх сигналів або SIG_DFLвідновлення дії за замовчуванням.

Тепер, якщо ви це зробите, $ command &тоді цей процес, що працює у фоновому режимі, просто ігнорує всі сигнали, які будуть виникати. Для процесів переднього плану ці сигнали не ігноруються.

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