Подтвердить что ты не робот

Как создать экран, выполнив заданную команду?

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

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

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

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

4b9b3361

Ответ 1

Проблема заключается в том, что использование команды "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
"

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

Ответ 2

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

screen -S "mylittlescreen" -d -m

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

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

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

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

$screen -v

Экран 4.00.03jw4 (FAU) 2-May-06

Подробнее о командах см. man screen.

Ответ 3

screen -dmS screen_name bash -c 'sleep 100'

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

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

Ответ 4

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

#!/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

Ответ 5

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

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

Тогда...

exec_in_screen "test" "ls"

Ответ 6

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

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

cd /dir
screen -dmS new_screen bash
screen -S new_screen -p 0 -X exec java -version

Ответ 7

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

например,

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

"

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