Я пытаюсь заставить экран GNU создать «виртуальный» терминал, не подключаясь к нему, выполнить сценарий внутри и НЕ завершать сеанс после завершения сценария.
Я перепробовал много комбинаций, в том числе:
screen -dmS udplistener /share/Sys/autorun/start_udp_listeners.sh
или
screen -S udplistener -X /share/Sys/autorun/start_udp_listeners.sh
и никто из них не работал. Я либо получаю сеанс без выполненного сценария, сценарий выполняется, но сеанс прекращается после его завершения, или я получаю сообщение об ошибке «Нет сеанса экрана найден»
В основном я пытаюсь запустить слушатель UDP, написанный на PHP, и заставить его работать в бесконечном цикле (не прерывать прослушивание). Да, я мог бы запустить PHP-скрипт &
в конце, заставив PHP CLI работать как демон. Проблема в том, что я использую кусок мусора, называемый сервером (QNAP - никогда, никогда не покупайте этот мусор!), Который, кажется, игнорирует это. Как только я завершаю сеанс SSH, сценарии останавливаются.
Так что, screen
кажется, единственный вариант. Но я не могу понять, почему он завершает сессию после завершения выполненной команды или сценария?
РЕДАКТИРОВАТЬ : Я также попробовал пример, найденный в Интернете:
screen -dmS name
screen -S name -p windowname -X stuff 'mc
'
Нет недостатка! После прикрепления к нему ( screen -R name
) я вижу, что Полуночный Командир не был казнен. Хотя автор примера сказал, что так и будет.
источник
screen
, вы только создаете одно окно для запуска одной команды. Когда команда завершается, окно закрывается иscreen
больше нечего делать, поэтому оно завершается.screen
закрытия? Кстати, я до сих пор не понимаю идею! Если я звонюscreen -dmS name
, я создаю отдельное окно, которому тоже нечего делать. Но он не закрывается автоматически! Но когда я хочу выполнить что-то на этом отдельном экране, это заканчивается, когда выполнение завершено. Зачем? Я не вижу здесь логики. Может ли окно ничего не делать, но не может, чтобы окно что-то делало, а потом ничего не делало?&
в конце), из-за глючного сервера (QNAP) они завершаются по окончании сеанса (мне сказали, что они не должны работать в обычном Linux, если выполняются с&
). Так что я не собираюсь ничего делать послеstart_udp_listeners.sh
финиша, только как предотвратить прекращение сессии. Пока это не так, мои слушатели PHP работают просто отлично.Ответы:
Чтобы экран был занят после завершения сценария, просто сохраняйте что-то постоянное в окне. Самый простой выбор для этого «чего-то» - это, вероятно, интерактивная оболочка. Вот один из способов сделать это (при условии
bash
выбора интерактивной оболочки):-dm
: запускает экран в отдельном режиме-S
: устанавливает имя сеанса для экрана для более удобного поиска позжеsh -c '...'
: вместо того, чтобы просто запустить скрипт, который завершится, используйтеsh -c
для запуска нескольких командexec bash
: после того, как скрипт завершится,sh
сверху переключится на интерактивную оболочку (bash
), которая никогда не завершится, пока что-то внешнее не завершит ее. Это будет оставатьсяscreen
открытым, покаbash
экземпляр жив.источник
export IGNOREEOF=1
для предотвращения случайного завершения с помощью Ctrl + D должно дать мне идеальное решение, которое я искал целый долгий вечер. БЛАГОДАРНОСТЬ! :]bash -c
хотя.screen -LS sauf bash -c "sudo aptitude update && sudo aptitude full-upgrade; exec bash"
Мне не повезло с
sh -c
моей Raspberry Pi 2 под управлением Debian 7.8. Ноbash -c
сделал работу:Команда:
источник
bash
И , какsh
представляется, два различных оболочек. Это все, я думаю, но я могу ошибаться, поскольку я новичок в Linux вообще.sh -c
кbash -c
сделал трюк. Я не понимаю, почему, обаsh
иbash
установлены, поэтому я все еще теряю сон из-за этого, но по крайней мере это работает.sh
вероятно указывает на/bin/dash
вместо/bin/bash
. Debian переключил оболочку по умолчаниюbash
наdash
несколько лет назад.