Фоновые процессы перепутывают порядок выполнения сценария оболочки

[

] Вы можете использовать комбинацию []SetEnvIf[] и []env=[] в определении журнала. [

] [

]В руководстве Apache это описано в разделе "Условный журнал", цитируя здесь.[

] [

] [

][]Conditional Logs[][

] [

]Бывают моменты, когда удобно исключить некоторые записи из журналы доступа, основанные на характеристиках запроса клиента. Данный сайт легко выполняется с помощью переменных окружения. Во-первых, переменная окружения должна быть установлена, чтобы показать, что запрос соответствует некоторые условия. Обычно это выполняется с помощью []SetEnvIf[]. Затем . выражение []env=[] директивы []CustomLog[] используется для включения или исключить запросы, в которых установлена переменная окружения. Некоторые примеры:[

] [

] [

# Mark requests from the loop-back interface 
  SetEnvIf Remote_Addr "127\.0\.0\.1" dontlog
# Mark requests for the robots.txt file 
  SetEnvIf Request_URI "^/robots\.txt$" dontlog
# Log what remains 
  CustomLog logs/access_log common env=!dontlog

] [

]Это описано в []этом разделе[] руководства.[

] [

]Вы бы искали что-то вроде (не тестируемого)[

] [

][]SetEnvIf Remote_Addr "157\. 98\.65\.xxx" донтлог[][

] [

]или[

] [

][]SetEnvIf User-Agent "collectd/4\.10\.9" донтлог[][

]

1
10.04.2015, 01:26
2 ответа
 echo one && 
отголосок два & 
отголосок три & & 
отголосок в четыре раза

Имейте в виду, что это анализируется как

echo one && echo two &
echo three && echo four

Я буду считать, что команды echo являются успешными (они будут неудачными только в крайних случаях, таких как переадресация на файл на полном диске). Таким образом, этот фрагмент параллельно выполняет две задачи: одна печатает строки одна и две , а другая - строки три и четыре . Интерпретация одной и двух с тремя и четырьмя не гарантируется и, вероятно, будет варьироваться от системы к системе, от оболочки к оболочке и от вызова к вызову. Для такого игрушечного примера вы можете наблюдать воспроизводимые результаты на слегка загруженной системе, но это не то, на что вы можете рассчитывать.

 echo one && 
(эхо два и) 
отголосок три & & 
отголосок в четыре раза

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

Оболочка печатает сообщение о фоновых процессах только в том случае, если они запущены из основной оболочки, а не когда они запущены в подоболочке. Круглые скобки создают подоболочку, поэтому (echo two &) не заставляет оболочку печатать какие-либо сообщения. Это создает фоновый процесс, но не фоновое задание .

echo one && 
(сон 2 и эхо 2 и эхо 2 и)
отголосок три & & 
отголосок в четыре раза

В этом фрагменте фоновое задание переходит в спящий режим на 2 секунды до вывода двух . Это делает чрезвычайно вероятным (но фактически не гарантированным), что два будут выведены после три и четыре .

1
27.01.2020, 23:37

Часть 1

echo one && 
echo two & 
echo three && 
echo four

Это можно переписать как

echo one && echo two & 
echo three && echo four

Причина, по которой вы получаете три и четыре во-первых, это просто то, что требуется больше времени, чтобы заставить подоболочку обрабатывать один и два и работать, чем для печати три и четыре .

Вы можете увидеть это более четко, как это

echo one && echo two &
sleep 1
echo three && echo four

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

Обратите внимание, что в исходном сценарии нет гарантии, что один и два не будут смешаны с выходными данными three и ] four , возможно, даже с интерполируемыми словами, такими как thonreee или twfouro .

Часть 2

echo one && 
(echo two &) 
echo three && 
echo four

Это можно переписать как

echo one && (echo two &) 
echo three && echo four

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

Часть 3

Скобки объединяют операторы в подоболочку. Амперсанд & применяется к оператору, но в этом случае вы использовали && , чтобы связать две команды вместе, поэтому их нужно рассматривать как один оператор.

Возможно, вам стоит использовать echo one; echo two вместо echo one && echo two ? Они очень разные. Точка с запятой ; разделяет две команды, которые затем выполняются независимо, но последовательно. Двойной амперсанд && объединяет две команды вместе как логическое И , так что вторая будет выполняться только в случае успешного завершения первой. Сравните ложь; echo yes , false && echo yes и true && echo yes . Затем поэкспериментируйте, заменив && ( логическое И ) на || ( логическое ИЛИ ).

Бонус

Вы теряете уведомление об управлении заданием, потому что подоболочка не имеет управления заданием.

1
27.01.2020, 23:37

Теги

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