У меня есть скрипт сценария script.sh
с командой cmd
запущенной в фоновом режиме, то есть:
#!/bin/bash
…
cmd &
…
Если я открою эмулятор терминала (я пробовал xfce4-терминал и gnome-терминал) и запускаю script.sh
внутри, моя команда cmd
эффективно выполняется и выполняется в фоновом режиме, как и ожидалось.
Но, если я открою эмулятор терминала из предыдущего (или в начале моего сеанса рабочего стола, который является моим реальным вариантом использования), и выполню мой сценарий
xfce4-terminal -H -x script.sh (or gnome-terminal -x script.sh)
команда cmd
больше не выполняется.
Я обнаружил, что могу заставить его исполниться, вставив set -m
в мой скрипт, но я не понимаю, почему это необходимо (или на самом деле недостаточно) в этом случае, а не в предыдущем. Действительно, если я добавлю в свой сценарий set -o
, я получу одинаковый вывод в обоих случаях.
Может кто-нибудь объяснить мне это и / или сказать, как правильно выполнять фоновые задания в сценариях оболочки? Спасибо!
РЕДАКТИРОВАТЬ: На самом деле, cmd
выполняется в обоих случаях, но во втором случае он немедленно уничтожается при завершении script.sh
. Чтобы предотвратить это, можно использовать nohup
, но этого недостаточно, и это самое странное для меня: нужно также поставить sleep 1
или что-то в этом роде, чтобы позволить процессу правильно запускаться в фоновом режиме и отделяться от родительская оболочка, иначе она тоже убивается.
Я действительно не понимаю эту разницу в поведении между двумя оболочками, так как они не являются интерактивными, как указано в предыдущем комментарии.