Настройка сеанса экрана при запуске системы

Для моего сценария sourceили .было нормально, но я хотел поддерживать локальные переменные среды (, т. е. FOO=bar myscript.sh), имеющие приоритет над сконфигурированными переменными. Я также хотел, чтобы файл конфигурации был редактируемым пользователем и удобным для тех, кто привык к исходным файлам конфигурации, и чтобы он был как можно меньше/простее, чтобы не отвлекать от основного направления моего очень маленького скрипта.

Вот что я придумал:

CONF=${XDG_CONFIG_HOME:-~/config}/myscript.sh
if [ ! -f $CONF ]; then
    cat > $CONF << CONF
VAR1="default value"
CONF
fi
. <(sed 's/^\([^=]\+\) *= *\(.*\)$/\1=${\1:-\2}/' < $CONF)

По существу -он проверяет определения переменных (без особой гибкости в отношении пробелов )и переписывает эти строки так, что значение преобразуется в значение по умолчанию для этой переменной, и переменная не изменяется, если она найдена, например переменная XDG_CONFIG_HOMEвыше. Он получает эту измененную версию файла конфигурации и продолжает работу.

Дальнейшая работа может сделать сценарий sedболее надежным, отфильтровать строки, которые выглядят странно или не являются определениями, и т. д., не прерывать комментарии в конце строки -, но на данный момент этого мне достаточно.

2
05.09.2019, 07:09
1 ответ

Как упоминает @DavidDai в своем комментарии, было бы лучше запускать их как системные службы (, например. создав для них служебные файлы systemd или сценарии запуска sysvinit ). Хотя это легче сказать, чем сделать.

Можно продолжать делать это с помощью экрана. Вам просто нужно создать файл конфигурации для экрана и использовать screen -c /path/to/screen/config(, чтобы переопределить файл конфигурации по умолчанию ~/.screenrc).

screen -t monitor1   0 sudo /path/to/monitor1.sh args 
screen -t monitor1   1 sudo /path/to/monitor2.sh args 
screen -t server     2 /path/to/service/script.sh

Если вы хотите, чтобы он запускался с активным определенным окном, вы можете добавить строку, подобную следующей:

select 1

Подробнее см. man screen.

Вам также потребуется настроить sudo, чтобы ваш пользователь мог запускать как script1.sh, так и script2.shот имени root.

Это не будет запускаться автоматически при перезагрузке rpi. Вам придется войти в систему и запустить screenвручную. Для автоматического запуска под вашим uid вы можете запустить его из @rebootзаписи crontab (подробности см. в man 5 crontab).

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


Кроме того, вы можете запустить отдельный экран (, например.screen -d -m -c /path/to/config)как корень (например. из /etc/rc.localили cronкак указано выше )и удаление sudoиз первых двух окон и добавление его к последнему:

screen -t monitor1   0 /path/to/monitor1.sh args 
screen -t monitor2   1 /path/to/monitor2.sh args 
screen -t server     2 sudo -u username /path/to/service/script.sh

Это будет запускаться автоматически при каждой перезагрузке rpi. Вы должны быть пользователем root, чтобы подключиться к этому экранному сеансу.


Наконец, если ваши сценарии мониторинга не нужно запускать от имени пользователя root, вам следует запускать их от имени менее привилегированного пользователя.Возможно, создайте нового пользователя и добавьте его в группу с доступом для чтения ко всему, что им нужно отслеживать.

2
27.01.2020, 22:16

Теги

Похожие вопросы