Запуск процесса в фоновом режиме с перенаправлением ввода / вывода

Мне любопытно узнать, имеет ли значение, где оператор '&' используется в коде, когда процесс имеет перенаправление ввода / вывода для запуска процесса в фоновом режиме

В чем различия / есть ли различия между этими строками кода с точки зрения запуска процесса в фоновом режиме. Если есть, как я могу определить, какие будут различия?

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 в отдельной строке, которую вы иногда видите в сценариях оболочки, работайте для усечения файла.)

Другие вопросы по тегам