Имеем: сервер на 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, вернее его содержимое (ком. строка запуска собственно игры).
Вопрос - где накосячил и как лечить???
Еще немного поисследовал и понял, что проблема собственно не в том, что нужный процесс запускается от рута (он как раз запущен от 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Вот как его туда "загнать", пока не знаю, как осуществить.. :(
Почитать man screen, потом man bash на тему передачи параметров. Затем использовать двойные кавычки, например так:
su -l gameadmin -c '/usr/bin/screen -AmdS bf2 "cd /game/bf2 && ./start_bf.sh' " > /dev/null 2>&1 &
>Почитать 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Кб текста на инглиш!! :-(
>[оверквотинг удален]
> Да и вызывает сомнение на правильность вот этого "участка"
>> 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 :)
...
> Все же очевидно и просто:Гм.. Вы на дату поста смотрели? ;)