Как создать экран, выполнив данную команду? - PullRequest
30 голосов
/ 13 августа 2011

Я довольно новый в * NIX.Есть ли способ создать экран, который будет сразу выполнять заданную последовательность команд (со своими аргументами)?Два часа поиска в Google ничего не дают - возможно, потому что я не могу четко сформулировать вопрос.

Я надеюсь на что-то вроде

screen -dmS new_screen exec "cd /dir && java -version"

Я использую screen v4.00.03 и CentOS 5.5 (версия ядра 2.6.18-194.26.1.el5.028stab079.2)

Ответы [ 7 ]

35 голосов
/ 13 декабря 2013

Вы создаете экран с именем и в отдельном режиме:

screen -S "mylittlescreen" -d -m

Затем вы отправляете команду, которая будет выполнена на вашем экране:

screen -r "mylittlescreen" -X stuff $'ls\n'

$ передкоманда должна заставить оболочку анализировать \ n внутри кавычек, а для выполнения команды требуется новая строка (например, когда вы нажимаете ввод).

Это работает для меня в этой версии экрана:

$ screen -v

Версия экрана 4.00.03jw4 (FAU) 2 мая-06

Подробную информацию о командах см. В man screen.

31 голосов
/ 13 августа 2011

Проблема в том, что использование экранной команды 'exec' не запускает оболочку. 'cd' - это встроенная оболочка, поэтому вам нужна оболочка для нее. Кроме того, вам нужна оболочка, которая продолжает работать, чтобы экран не закрывался.

Вы можете использовать опцию -X для отображения на экране, чтобы отправлять команды в сеанс работающего экрана, и команду 'stuff', чтобы отправлять нажатия клавиш в текущее окно. Попробуйте это:

screen -dmS new_screen sh
screen -S new_screen -X stuff "cd /dir
"
screen -S new_screen -X stuff "java -version
"

Да, для выполнения команд необходимо поместить кавычки в следующую строку.

5 голосов
/ 21 сентября 2016

screen -dmS screen_name bash -c 'sleep 100'

Это создаст новый экран с именем screen_name.А внутри экрана он будет спать в течение 100 секунд.

Обратите внимание, что если вы введете какую-то команду вместо sleep 100, которая завершается сразу после выполнения, экран также завершится. Так что вы не сможете увидеть экран, который вы только что создали

2 голосов
/ 18 мая 2014

Я хотел запустить удаленные экраны из скрипта bash с некоторыми переменными, определенными внутри скрипта bash и доступными внутри экрана.Так что для меня сработало:

#!/bin/bash
SOMEVAR1="test2"
# quit existing if there is one running already, be careful
screen -D -RR test1 -X quit || true
screen -dmS test1
screen -r test1 -p 0 -X stuff $"echo ${SOMEVAR1} ^M"

Где возвращаемый символ ^ M, вам нужно ввести, используя vim как

i CTRL-V ENTER ESCAPE
1 голос
/ 05 января 2016

Я думаю, что вы можете использовать это

function exec_in_screen() {
  name=$1
  command=$2
  screen -dmS $name sh; screen -S $name -X stuff "$command\n";
} 

Тогда ...

exec_in_screen "test" "ls"

0 голосов
/ 28 января 2017

Другой подход

Первая строка cd в ваш каталог.Вторая строка запускает новый сеанс экрана с именем new_screen с помощью bash.Выполнение третьей строки java -version

cd /dir
screen -dmS new_screen bash
screen -S new_screen -p 0 -X exec java -version
0 голосов
/ 13 августа 2011

Да, вам нужна команда "stuff"

например

screen -dmS new_screen -X stuff "cd / dir && java -version

"

вторая кавычка находится на следующей строке, поэтому она выполняется при отправке

...