Запустите программу с экраном 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" был проигнорирован. Я также пытался процитировать команду и тоже не помогает.

TbMA
источник
Почему -Xвариант?
энзотиб
stackoverflow.com/questions/6534386
Тревор Бойд Смит

Ответы:

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
Arcege
источник
Если вы поместите программу в командную строку, экран закроется при выходе из программы; Я не вижу флаг командной строки, чтобы держать экран открытым, если вы хотите увидеть вывод консоли. Если вы запускаете экран и отправляете команды отдельно, как показано здесь, вам могут потребоваться явные sleepкоманды, чтобы дать экранное время, чтобы начать сеанс перед отправкой команды.
Chinasaur
Этот ответ очень похож на ответ на stackoverflow.com, который отвечает на аналогичный вопрос . Я предпочитаю этот ответ больше, чем @CryHavok, потому что этот ответ выполняет вашу программу в оболочке вашего пользователя по умолчанию (@CryHavok запускает вашу программу без родительской оболочки, поэтому, когда программа умирает или вы нажимаете ctrl-c, сеанс экрана немедленно прекращается)
Тревор Бойд Смит