Как передать команду сеансу экрана?

Я пишу сценарий оболочки Linux, в котором мне нужно запустить новый сеанс экрана, запустить сервер node.js на экране, а затем отсоединиться от экрана, чтобы мой сервер работал в фоновом режиме.

Прямо сейчас это команды, которые я запускаю вручную, чтобы сделать это:

screen
node server.js
[detach screen]

Однако мне нужен способ автоматизировать это с помощью сценария, и если я просто использую приведенные выше команды в сценарии оболочки, он создает экран и застревает там. Как я могу передать команду «node server.js» в команду экрана?

РЕДАКТИРОВАТЬ:

Основываясь на предложенном ответе, у меня есть работающий скрипт, за исключением того, что мне нужно вручную создать экран и отсоединиться от него, прежде чем запускать его. Я попытался добавить screen -d -m в качестве первой строки для создания отдельного экрана, но скрипт зависает после этой строки.

tempfile=$(mktemp)
indices=`tail -1 debug.log`
cat > $tempfile <<EOF
node server $indices
EOF
screen -X readbuf $tempfile 
screen -X paste . 
rm -f $tempfile

Как я могу создать и отсоединить экран со скриптом?

Это тоже не сработало: screen screen -d


person Sara    schedule 11.07.2014    source источник


Ответы (2)


Это так просто: screen -md node server.js Для этого требуется, чтобы команда работала как служба (что и происходит), иначе экран немедленно останавливается.

Чтобы при желании также установить имя для сеанса (например, «имя сеанса»): screen -mdS session-name node server.js Затем вы можете подключиться к экрану с помощью: screen -rd session-name Если вы хотите перенаправить весь вывод в файл, вы можете сделать это следующим образом: screen -mdS session-name bash -c 'node server.js &> output.log' Затем вы можете контролировать вывод, например: tail -f output.log

Вы можете перечислить свои беговые экраны с помощью: screen -ls или screen -list

Пример: запуск веб-сервера Python3 на отдельном экране

Запустите веб-сервер Python3, прослушивающий порт 8000, который обслуживает файлы в текущем каталоге, на именованном отдельном экране: screen -mdS my-web-server python3 -mhttp.server Или, с записью в файл: screen -mdS my-web-server bash -c 'python3 -mhttp.server &> output.log' Для Python 2.x это выглядит так: screen -mdS my-web-server bash -c 'python -mSimpleHTTPServer &> output.log'

person knuth    schedule 02.08.2016

РЕДАКТИРОВАТЬ: Попробуйте это:

tempfile=$(mktemp)
cat > $tempfile <<EOF
node server.js
EOF
screen -S SessionName -X readbuf $tempfile; screen -RdS SessionName
screen -X paste .
rm -f $tempfile

Он должен создать временный файл, создать экран с именем SessionName и запустить команды, а затем удалить временный файл. Дай мне знать, если это работает.

person michaelrmcneill    schedule 13.07.2014
comment
Спасибо, Михаил, но проблема та же. Когда я запускаю его, он запускает новый экран, но зависает там. Но теперь, когда я отсоединяюсь от экрана, командная строка говорит, что сеанс экрана не найден.\n [отсоединен от 6930.SessionName], тогда как раньше он ничего не говорил. Кроме того, что делает -RdS? - person Sara; 13.07.2014