Как создать экран, выполнив заданную команду?
Я новичок в * 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)
Ответы
Ответ 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
"
вторая цитата находится на следующей строке, так что она выполняется при отправке