URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 79679
[ Назад ]

Исходное сообщение
"Как запустить программу в screen от простого пользователя?"

Отправлено KovAl , 07-Апр-08 12:16 
Имеем: сервер на linux Fedora Core 6 с установленными на нем игровыми серверами.
Задача: при старте/рестарте машины запустить игр. сервера в screen от непривилегированного пользователя (админа игр. серверов), чтобы последний мог зайти по ssh на сервак и админить игрушки, используя соотв. screen.
Попытался сделать следующее (на примере BattleField):
в /etc/rc.d/rc.local добавляю такую строку запуска -
su -l gameadmin -c '/usr/bin/screen -AmdS bf2 && cd /game/bf2 && ./start_bf.sh' > /dev/null 2>&1 &
Софтина стартует, НО! При попытке зайти в screen пользователем gameadmin, командой screen -dr bf2, оказывается что screen "пустой"..
Смотрю процессы, связанные с данным сервисом. Их всего 4. Первый содержит всю ком. строку, но запущен от root-а, второй содержит тоже самое, но от юзера gameadmin. В третьем запуск screen от юзера gameadmin и в четвертом запуск собственно скрипта start_bf.sh, вернее его содержимое (ком. строка запуска собственно игры).
Вопрос - где накосячил и как лечить???

Содержание

Сообщения в этом обсуждении
"Как запустить программу в screen от простого пользователя?"
Отправлено KovAl , 07-Апр-08 14:26 
Еще немного поисследовал и понял, что проблема собственно не в том, что нужный процесс запускается от рута (он как раз запущен от gameadmin-а), а в том, что он запущен ОТДЕЛЬНО, а не внутри screen. Т.е. screen и сама игрушка существуют по-отдельности. А надо именно запустить игру в screen.
>[root@games ~]# ps auxw | grep bf
>root      9841  0.0  0.0   4792  1144 pts/1    S    11:44   0:00 su -l gameadmin -c /usr/bin/screen -AmdS bf2 && cd /game/bf2 && ./start.sh
>gameadmin   9842  0.0  0.0   4488  1232 ?        Ss   11:44   0:00 -bash -c /usr/bin/screen -AmdS bf2 && cd /game/bf2 && ./start.sh
>gameadmin   9861  0.0  0.0   4864   968 ?        Ss   11:44   0:00 /usr/bin/SCREEN -AmdS bf2
>gameadmin   9863  5.2  2.8 180956 116300 ?       Rl   11:44   8:07 /game/bf2/bin/ia-32/bf2

Вот как его туда "загнать", пока не знаю, как осуществить.. :(



"Как запустить программу в screen от простого пользователя?"
Отправлено angra , 07-Апр-08 17:07 
Почитать man screen, потом man bash на тему передачи параметров. Затем использовать двойные кавычки, например так:
su -l gameadmin -c '/usr/bin/screen -AmdS bf2 "cd /game/bf2 && ./start_bf.sh' " > /dev/null 2>&1 &

"Как запустить программу в screen от простого пользователя?"
Отправлено KovAl , 07-Апр-08 17:47 
>Почитать man screen, потом man bash на тему передачи параметров. Затем использовать
>двойные кавычки, например так:
>su -l gameadmin -c '/usr/bin/screen -AmdS bf2 "cd /game/bf2 && ./start_bf.sh' " > /dev/null 2>&1 &

Неа.. Не катит.. Ваш пример при старте с консоли выводит ">" и успешно висит, не создавая никаких процессов.. Последующее Ctrl-C его просто убивает.. Да и вызывает сомнение на правильность вот этого "участка"
> start_bf.sh' "

Если учесть то, что сначала открываются одинарные кавычки, затем двойные, а впоследствии закрываются наоборот...
Пробовал изменить на
> su -l gameadmin -c '/usr/bin/screen -AmdS bf2 "cd /game/bf2 && ./start_bf.sh"' > /dev/null 2>&1 &

результат почти аналогичный (долго рассказывать какой, но одним словом - не работает)... :(

P.S. Прочесть man screen не хватает духу - 177Кб текста на инглиш!! :-(



"Как запустить программу в screen от простого пользователя?"
Отправлено METAJIJI , 16-Июн-14 19:55 
>[оверквотинг удален]
> Да и вызывает сомнение на правильность вот этого "участка"
>> start_bf.sh' "
> Если учесть то, что сначала открываются одинарные кавычки, затем двойные, а впоследствии
> закрываются наоборот...
> Пробовал изменить на
>> su -l gameadmin -c '/usr/bin/screen -AmdS bf2 "cd /game/bf2 && ./start_bf.sh"' > /dev/null 2>&1 &
> результат почти аналогичный (долго рассказывать какой, но одним словом - не работает)...
> :(
> P.S. Прочесть man screen не хватает духу - 177Кб текста на инглиш!!
> :-(

Все же очевидно и просто:
su -l gameadmin -c "cd /game/bf2; /usr/bin/screen -AmdS bf2 ./start_bf.sh;"

По порядку:
su -l gameadmin -- переключается на пользователя, будто бы он вошел в систему.
/usr/bin/screen -AmdS bf2 -- команда screen, с опциями, а в качестве аргумента принимает команды для запуска.
./start_bf.sh -- собственно команда, которую хотим запустить в screen.
cd /game/bf2 -- костыль, который нужен для скрипта start_bf.sh очевидно в котором прописаны относительные пути.
Следовательно, cd /game/bf2 нужно делать ДО запуска start_bf.sh.

> /dev/null 2>&1 -- отправит STDERR и STDOUT в /dev/null - ваш скрин будет пуст!

& -- еще и имперсанд в конце заставит команду выполняться в фоне - а смысл, чего хотели добиться?! У вас ведь запускается screen, который как раз отправит в фон, то что вы запускаете в нем! :)
И да, боюсь чтение man screen никак вам не поможет. Вам скорее man sh или man bash подойдет - как вообще что-либо запускать в *nix :)


"Как запустить программу в screen от простого пользователя?"
Отправлено KovAl , 18-Июн-14 17:35 
...
> Все же очевидно и просто:

Гм.. Вы на дату поста смотрели? ;)