Чому я можу бачити вихід фонових процесів?


31

Наприклад, коли я друкую ping 8.8.8.8 &, чому ми можемо бачити, як працює процес ping? І коли я друкую find / -name '*test*' &, це також видно на моніторі.

Чому так? Це насправді не на задньому плані?

Відповіді:


43

&Привертає оболонку для запуску команди у фоновому режимі, тобто, він роздвоєний і запустити в окремому субрахунку оболонки, як робота, асинхронно.

Зауважте, що коли ви поставите &вихід - і stdout, і stderr - він все одно буде надрукований на екран . Якщо ви не хочете бачити жодного виводу на екрані, перенаправляйте stdoutі stderrфайл, і файл:

myscript > ~/myscript.log 2>&1 &

Зазвичай ви можете скасувати stderr, перенаправляючи його, /dev/nullякщо ви не переживаєте за аналіз помилок пізніше.

Ви також можете одночасно запускати команди / сценарії в окремих підрозділах. Наприклад, наприклад;

./script1 & ./script2 & ./script3 & 

Фонове завдання можна повернути до командного рядка, перш ніж воно закінчиться командою:

fg <job-number>

job-numberМожна отримати, виконавши

jobs

Гарна відповідь. Ви можете включити, що ви можете також використовувати /dev/nullяк файл для перенаправлення вихідного терміналу, якщо ви хочете відкинути вихід, а не зберегти його десь. І я прав , що 2>&1переадресовує stderrдо stdout? Можливо, ви теж хочете уточнити це ... Дякую.
Байт-командир

@ByteCommander Спасибі :) відредаговано, сподіваюсь, це зрозуміло зараз. Так, ви праві, 2>&1переадресація stderrна stdout.
Рон

3
Я думаю, що варто було б згадати, що stty tostopпризупинення фонових завдань буде припинено, якщо вони спробують написати до терміналу.
kasperd

cmd_with_params> / dev / null 2> / dev / null &
tgkprog

Єдиним недоліком цього є те, що порядок виходів stdout та stderr може змішатися у файлі журналу.
matthieu

8

Під час використання &процес працює у фоновому режимі. Але його стандартний вихід все ще є терміналом.

Насправді ви можете працювати ping 8.8.8.8 &і find / -name '*test*' &в той же час (в результаті виходить змішаний вихід), але ви можете не працювати ping 8.8.8.8і find / -name '*test*'одночасно на одній оболонці.

Якщо ви нічого не хочете бачити, використовуйте щось подібне ping 8.8.8.8 &> /dev/null &.


Крім того, ви можете дізнатися про nohupта disown.


disownне заважає друкувати вихід на термінал.
Руслан

@Ruslan: ні, але це видаляє завдання з оболонки. Що може (чи не може) бути чимось зацікавленим в ОП.
Андреа Корбелліні
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.