Фонові завдання в скриптах оболонки


0

У мене є скрипт оболонки script.shз командою, cmdзапущеною у фоновому режимі, тобто:

#!/bin/bash

cmd &

Якщо я відкрию емулятор терміналу (я спробував xfce4-terminal та gnome-terminal) і запускаю script.shвсередині, моя команда cmdефективно виконується та виконується у фоновому режимі, як очікувалося.

Але якщо я відкрию емулятор терміналу з попереднього (або на початку мого сеансу на робочому столі, що є моїм реальним випадком використання), і виконую свій сценарій

xfce4-terminal -H -x script.sh (or gnome-terminal -x script.sh)

команда cmdбільше не виконується.

Я виявив, що я можу змусити його виконати, ввівши set -mсвій сценарій, але я не розумію, чому це потрібно (а не достатньо насправді) у цьому випадку, а не в попередньому. Дійсно, якщо я поміщаю set -oв свій сценарій, я отримую однаковий результат в обох випадках.

Чи може хтось мені це пояснити та / або підказати правильний спосіб продовження фонових завдань у скриптах оболонки? Дякую!


EDIT: Насправді, cmdвиконується в обох випадках, але у другому він негайно вбивається після закінчення script.sh. Щоб цього не допустити, можна скористатися nohup, але цього недостатньо, і для мене це найдивніше: треба також поставити sleep 1або щось подібне, щоб дозволити належним чином запустити процес у фоновому режимі та відмежуватися від батьківської оболонки, інакше його також вбивають.

Я дійсно не розумію цієї різниці в поведінці між обома оболонками, оскільки обидві не інтерактивні, як сказано в попередньому коментарі.


Як ви впевнені cmd, що не виконуєте? Це легко і унікально знайти у виводі PS (і триває достатньо довго, щоб знайти), або він видає звук або іншу індикацію GUI?
Xen2050

@ Xen2050 Як правило, я обираю cmdте, що можна побачити в диспетчері завдань, як, наприклад, sleep nз nдосить великим. Але можна вибрати щось із графічним інтерфейсом, як- firefoxнебудь або щось інше.
Гліф

Відповіді:


1

Якщо ви відкриєте xfce4-trminalабо gnome-terminal(або інший термінал), ваша оболонка знаходиться в інтерактивному режимі. Кожен сценарій запускається в інтерактивному режимі.

Якщо Ви біжите script.shчерез

xfce4-terminal -H -x script.sh

або

gnome-terminal -x script.sh

або інший термінал, ваша оболонка знаходиться в неінтерактивному режимі.

Сценарії можуть бути змушені працювати в інтерактивному режимі з -iопцією або із #!/bin/bash -iзаголовком. Майте на увазі, що це може спричинити помилкову поведінку сценарію або показати повідомлення про помилки, навіть якщо помилки немає.

Що таке set -m? Це режим монітора . Фонові процеси виконуються в окремій групі процесів і після їх завершення друкується рядок, що містить їх статус виходу. Він включений за замовчуванням для інтерактивних оболонок.

Що таке set -o? Це записати поточні параметри параметрів для стандартного виводу у не визначеному форматі.

Чому set -oпрацює?

Параметр −o був прийнятий в KornShell для задоволення потреб користувачів. Окрім загальнодоступного інтерфейсу, −o необхідний для забезпечення режиму редагування командного рядка vi, для якого історична практика не дає однозначного імені опції. (Хоча, можливо, було б можливо винайти таку букву, було визнано, що будуть розроблені інші режими редагування - і надається достатньо простору імен для опису таких розширень.)

Історичні реалізації не відповідають формату, який використовується для звітування про статус опціонів. Формат + o без аргументу параметра був доданий, щоб дозволити портативний доступ до параметрів, які можна зберегти, а потім пізніше відновити, використовуючи, наприклад, крапковий сценарій.

У будь-якому випадку, set -mце кращий спосіб.


Ні ... оболонка у вашому терміналі інтерактивна, але та, яка викликала запуск сценарію, не є. Це я спостерігаю, зокрема, вкладаючи set -oсвій сценарій: в обох випадках його вихід є однаковим, зокрема щодо режиму монітора, який встановлений у вимкненому режимі (за замовчуванням у неінтерактивному режимі). Я не set -oхочу бачити, чи працює він, а щоб побачити його вихід.
Гліф

0

На питання відповіли в Unix Stackexchange (див. Також додаткові коментарі нижче відповіді). Це питання, хто надсилає сигнал SIGHUP кому і коли. І альтернативою set -m / set +mнавколо cmd &в script.shє trap '' HUP / trap - HUP.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.