Запуск программы в screen при старте системы
Screen очень полезная программа, фактически это оконный менеджер для терминала. Подробнее можно посмотреть тут http://ru.wikipedia.org/wiki/GNU_Screen
В чем суть? Когда вы закрываете терминал, запущенные в нем программы также завершаются. Но ели вы запустите программы в окнах-терминалах screen, при закрытии сессии все ваши программы будут выполняться как ни в чем не бывало в одном из его окон-терминалов.
Есть у screen еще одна интересная особенность. 2 человека зайдя в систему под одним пользователем могут использовать один и тот же набор окон-терминалов для совместной работы, т.е. первый пользователь будет видеть все что делает второй в режиме онлайн и наоборот.
Как мы используем это? Для старта приложений, которые запускаются в интерактивном режиме. Например Apache Karaf при запуске открывает свою консоль. Управление Karaf через консоль - это очень продуктивный метод управления, и отказываться от него нужно только в крайних случаях.
Итак, под пользователем karaf мы запускаем screen и в одном из окон-терминалов запускаем karaf. Всем удобно, все довольны. Однако, первая же перезагрузка системы разрушила эту идиллию. Естественно ни screen, ни karaf не запустились.
Исправим это легкое недоразумение. (Сервер для которого делаем загрузку работает на CentOS 6)
После пары часов гугления и экспериментов получаем в /etc/rc.local такую строку:
su - karaf -c "screen -d -m -S krf sh /opt/apache-karaf/bin/karaf"
Тут есть одна тонкость. Сессия screen (именованный набор окон-терминалов) может находится в одном из 2 состояний: Attached и Detached, и если мы запустим так
su - karaf -c "screen sh /opt/apache-karaf/bin/karaf"
то при старте системы screen-сессия будет в состоянии Attach, а вы получите как бы зависшую загрузку. Я точно незнаю, что происходит, но XServer загружается не на том устройстве /dev/pts. Если кто-то знает причину - буду признателен за подсказку. В общем загрузка проходит не так как должна.
Поэтому я загружаю screen в Detach режиме, и при этом присваиваю имя detach-сессии в которую загрузил karaf. При загрузке под пользователем karaf нам необходимо detach screen перевести в состояние attach, для этого я в /home/karaf/.bashrc написал следующее:
SCREEN_SESSION_NAME=$(screen -list | egrep -o "([0-9])+\.krf") if [ -n $SCREEN_SESSION_NAME ]; then screen -r $SCREEN_SESSION_NAME; fi;
Detach сессия screen'a создается с именем определенного формата, например 2341.krf, где krf - имя, которое мы указали при создании сессии. Логика проста, если при входе в систему пользователя karaf была обнаружена detach-сессия, название которой оканчивается на krf - переводим её в состояние attach.
При первом после перезагрузке вхождении в учетку karaf, сразу будет запущена screen-сессия c консолью karaf'a. При повторных вхождениях screen-сессию можно запустить как обычно, набрав screen -x.
Удачи!