Запуск процесса в фоновом режиме с перенаправлением ввода / вывода
Мне любопытно узнать, имеет ли значение, где оператор '&' используется в коде, когда процесс имеет перенаправление ввода / вывода для запуска процесса в фоновом режиме
В чем различия / есть ли различия между этими строками кода с точки зрения запуска процесса в фоновом режиме. Если есть, как я могу определить, какие будут различия?
setsid python script.py < /dev/zero &> log.txt &
setsid python script.py < /dev/zero & > log.txt &
setsid python script.py < /dev/zero > log.txt &
setsid python script.py & < /dev/zero > log.txt
3 ответа
Оператор управления
Есть два варианта использования &
Вот. Одним из них является так называемый оператор управления. Каждая команда завершается оператором управления, таким как &
, ;
или же <newline>
, Разница между ними в том, что ;
а также <newline>
запустить команду на переднем плане и &
делает это в фоновом режиме.
setsid python script.py < /dev/zero & > log.txt &
setsid python script.py & < /dev/zero > log.txt
Эти две строки, следовательно, фактически выполняют две команды каждая. Первая эквивалентна двум командам:
setsid python script.py < /dev/zero &
> log.txt &
И второе эквивалентно:
setsid python script.py &
< /dev/zero > log.txt
Если вам интересно, да, > log.txt
а также < /dev/zero > log.txt
обе легальные команды. Не имея имени команды, они просто обрабатывают перенаправления: каждый создает пустой файл с именем log.txt
,
Перенаправление
setsid python script.py < /dev/zero &> log.txt &
Эта версия с &>
отличается от того, с & >
, &>
без пробела есть специальный оператор перенаправления в bash, который перенаправляет как stdout, так и stderr.
setsid python script.py < /dev/zero > log.txt &
Эта финальная версия похожа на предыдущую, за исключением того, что перенаправляет только стандартный вывод на log.txt
, Стдерр продолжает идти в терминал.
Итак &
означает разные вещи, в зависимости от контекста.
В первом случае:
setsid python script.py < /dev/zero &> log.txt &
первый &
используется вместе с >
как &>
что означает перенаправление как stderr, так и stdout. Последний &
значит бегать в фоновом режиме
Во втором случае:
setsid python script.py < /dev/zero & > log.txt &
У вас первый &
один, что, как указано выше, означает, но процесс в фоновом режиме, в данном случае это setsid python script.py < /dev/zero
, который ставится в фоновом режиме. Затем остальная часть строки говорит: "Не перенаправляйте процесс в log.txt и исправляйте его, на самом деле это чепуха".
В третьем случае:
setsid python script.py < /dev/zero > log.txt &
У тебя есть &
в конце концов, все это помещается в фоновый режим, однако ваше перенаправление перенаправляет только stdout в log.txt, а не stderr, как в первом случае.
В последнем случае:
setsid python script.py & < /dev/zero > log.txt
Вы положили setsid python script.py
в фоновом режиме, и перенаправить стандартный вывод ничего в log.txt, и помещает /dev/zero
в ничто.
Это имеет значение. &
удваивается как разделитель команд (так же, как ;
является разделителем команд). Что вы действительно делаете в чем-то вроде
setsid python script.py & < /dev/zero > log.txt
бежит setsid python script.py
в фоновом режиме, а также запуск "нулевой" команды (которая идет после &
) на переднем плане (дополнительный &
в конце будет запускаться в фоновом режиме). Эта "нулевая" команда перенаправляет свой стандартный ввод в /dev/zero, а стандартный вывод - в log.txt.
Также, &>
это специальный оператор в Bash. foo &>out
перенаправляет как stdout, так и stderr во время работы foo
, Это не то же самое, что foo & >out
, который работает foo
на заднем плане также перенаправляет вывод пустой команды на out.
(Эта поддержка "нулевых" команд - вот почему идиомы, такие как >foo
в отдельной строке, которую вы иногда видите в сценариях оболочки, работайте для усечения файла.)