28

Я использую Red Hat Linux Enterprise версии 5. Я заметил, что люди иногда запускают команды с парой опций & . Например, в приведенной ниже команде есть два знака & . Какова цель их? Они всегда используются вместе с nohup?

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

6 ответов6

31

В сценарии оболочки bash амперсанд «&» используется для разветвления процессов:

find -name hello &

Приводит к тому, что команда find будет разветвлена и запущена в фоновом режиме (вы всегда можете убить ее, используя ее PID).

26

зачем запускать команду оболочки Linux с &?

Чтобы немедленно вернуть ваше приглашение и запустить процесс в фоновом режиме.

Каковы их функции?

nohup позволяет фоновому процессу продолжать работу даже после выхода пользователя из системы (или выхода из инициирующей оболочки).

> & перенаправляет как стандартный вывод, так и стандартную ошибку в файл журнала.

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

Объяснение:

Каждый процесс Linux открывает три канала ввода-вывода, вход "stdin", стандартный вывод "stdout" и стандартный вывод ошибок "stderr". Они могут использоваться для двоичного кода, но традиционно являются текстовыми. Когда большинство программ видит stdin close, они закрываются (это может изменить программист).

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

Итак, что делает nohup, так это дает дочернему процессу отдельную среду ввода-вывода, связывая входы и выходы с чем-то, не привязанным к родительской оболочке, и защищая дочерний процесс от сигнала SIGHUP. Как только пользователь отключится, вы увидите фоновый процесс nohup, принадлежащий init (процесс 1), а не оболочка пользователя.

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

15

В дополнение к ответам Мартина, Эша и Кевина, иногда вы увидите амперсанд, используемый математически для побитового И *:

$ echo $(( 11 & 7 ))
3

Если вы не знакомы с битовыми операторами:

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

В каждой позиции есть один бит в первом числе и второе число, установите этот бит в единицу в ответе.

* Функция в ответе Кевина называется логическим AND.

Чтобы уточнить ответ Эша, при использовании перенаправления амперсанд может сказать оболочке скопировать дескриптор файла. В этой команде echo "hello" > outputfile 2>&1 амперсанд заставляет любой вывод, который может перейти к стандартной ошибке (stderr, дескриптор файла 2), перейти в то же место, что и стандартный вывод (stdout, дескриптор файла 1, по умолчанию для левая сторона >). Оператор >& outputfile является сокращением для > outputfile 2>&1 .

Кроме того, впервые в Bash 4, есть два новых терминатора для предложений в команде case ;& и ;;& которые влияют на то, проваливается ли дело и, если да, выполняется ли следующий тест.

13

В дополнение к ответу @ Martin: Другое использование амперсанда (>& как выше) - захватить как stdout и stderr . Обычно, если вы перенаправили вывод в файл только с «>», вы получите только вывод на стандартный stdout , пропуская все ошибки.

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 ~]$
2

Ответ Мартина хороший, но немного неоднозначный. Команда всегда форк-и исполняется, но нормальное поведение оболочки - ждать команды до ее выхода. Амперсанд помещает его в фоновый режим, чтобы вы вернули подсказку своему терминалу и могли делать другие вещи. Если процесс выплескивает данные в stdout или stderr, это будет смешано с тем, что вы делаете в приглашении, и может сбить вас с толку. Вот почему вы перенаправляете затем с помощью> & /path/to/logfile.txt.

В ответ на George2 нормальным поведением для выхода из оболочки является отправка сигнала SIGHUP всем процессам в одной и той же группе процессов (по существу, вещи, которые вы породили), и они обычно завершаются. Если вы хотите, чтобы это продолжалось, даже если вы закрываете процесс оболочки, вы можете использовать команду nohup, чтобы они игнорировали этот сигнал и продолжали работать. Для этого типа процесса есть специальное имя, которое называется процессом демона (произносится как «демон»).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .