Запустите программу с экраном GNU и сразу отсоедините после


27

Я пытаюсь выяснить, как написать сценарий, который будет запускать программы в сеансах экрана GNU при загрузке системы. Я пытаюсь это:

#!/bin/bash
screen -S test -d -m -X $HOME/folder/folder/.program \
screen -S test2 -d -m -X $HOME/folder/folder/.program2 \

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

Спасибо за ответы, но теперь я столкнулся с другой проблемой. Скрипт перестает работать после того, как я поставил некоторые переменные для моей «программы и программы2». Что-то вроде этого:

#!/bin/bash
screen -S test -d -m $HOME/folder/folder/.program -f config.cfg

по какой-то причине "-f config.cfg" был проигнорирован. Я также пытался процитировать команду и тоже не помогает.


Почему -Xвариант?
— энзотиб

Ответы:


34

Вы действительно хотели поставить \в конце строки? Если нет, попробуйте удалить их - они избегают следующего символа.

Кроме того, удаление -Xнастроек помогает мне работать, например:

screen -S test -d -m -X touch /tmp/test

не удается No screen session found, однако:

screen -S test -d -m touch /tmp/test

работает отлично. Поэтому я подозреваю, что для вас будет работать следующее:

#!/bin/bash
screen -S test -d -m $HOME/folder/folder/.program
screen -S test2 -d -m $HOME/folder/folder/.program2

Помните, что если вы запустите это во время загрузки, $ HOME будет отличаться от того, что вы сделали после входа в систему под именем конкретного пользователя. Если вам нужно запустить его от имени определенного пользователя, вам нужно будет использовать его, suчтобы запустить его от имени этого пользователя, и указание полного пути устранит любую двусмысленность:

#!/bin/bash
screen -S test -d -m su - username /home/username/folder/folder/.program
screen -S test2 -d -m su - username /home/username/folder/folder/.program2

Или вы бы назвали весь сценарий выше как su - username /path/to/your/script.


Спасибо за ответы, но теперь я столкнулся с другой проблемой. Скрипт перестает работать после того, как я поставил некоторые переменные для своей «программы и программы2»
— TbMa

Это: screen -S test -d -m $HOME/folder/folder/.programпочти делает именно то, что я ищу, за исключением того, что папка / .program завершена, сеанс экрана автоматически закрывается. Есть ли способ сохранить экранную сессию (оболочку) запущенной даже после завершения программы? Возможно, вместо того, чтобы запускать программу исключительно, запустите оболочку, которая запускает программу и затем возвращается к приглашению оболочки, или что-то еще?
— RocketNuts

4

Как упоминалось в Cry Havok, вы можете разместить программу прямо в командной строке.

Если вы действительно должны использовать опцию -X, то а) вам нужно указать команду 'screen' и б) сеанс должен существовать заранее.

screen -dmS test
screen -S test -X screen $HOME/folder/folder/.program
screen -dmS test2
screen -S test2 -X screen $HOME/folder/folder/.program2

Если вы поместите программу в командную строку, экран закроется при выходе из программы; Я не вижу флаг командной строки, чтобы держать экран открытым, если вы хотите увидеть вывод консоли. Если вы запускаете экран и отправляете команды отдельно, как показано здесь, вам могут потребоваться явные sleepкоманды, чтобы дать экранное время, чтобы начать сеанс перед отправкой команды.
— Chinasaur

Этот ответ очень похож на ответ на stackoverflow.com, который отвечает на аналогичный вопрос . Я предпочитаю этот ответ больше, чем @CryHavok, потому что этот ответ выполняет вашу программу в оболочке вашего пользователя по умолчанию (@CryHavok запускает вашу программу без родительской оболочки, поэтому, когда программа умирает или вы нажимаете ctrl-c, сеанс экрана немедленно прекращается)
— Тревор Бойд Смит
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.