Как запустить сеанс экрана с помощью задания upstart от имени непривилегированного пользователя?

Как запустить сеанс экрана с помощью задания upstart от имени непривилегированного пользователя?

Я пытаюсь создать задание Upstart, которое запускает новый screenсеанс при загрузке, в котором я хотел бы автоматически запустить javaисполняемый файл. Вот файл .conf, который я сейчас пытаюсь заставить работать, хотя я пробовал и несколько других:

description     "Run the bungeecord jar"

start on (local-filesystems and net-device-up IFACE=eth0 and runlevel [2345])
stop on runlevel [016]

exec start-stop-daemon --start -c ridog --exec /usr/bin/screen -- -dmUS BungeeCord java -server -XX:UseSSE=4 -XX:+UseCMSCompactAtFullCollection -XX:MaxPermSize=356m -XX:ParallelGCThreads=6 -XX:+UseConcMarkSweepGC -XX:+DisableExplicitGC -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:+UseCompressedOops -XX:+AggressiveOpts -Xmx256M -jar BungeeCord.jar

pre-stop script
    screen -S BungeeCord -X foo "end^M"
end script

Насколько мне известно, скрипт работает нормально, я могу запустить его sudo start bungeecordи получить желаемый результат, однако перезагрузка машины не работает. Вместо этого я получаю эту ошибку в /var/log/upstart/bungeecord.log:

Cannot make directory '/var/run/screen': Permission denied

Я искал эту ошибку, и результаты поиска неясны и неопределенны. Я пробовал запустить команду как root, это устраняет ошибку, но screenсеанса все еще нет. Я пробовал разные команды, например:

su ridog -c "screen -dmS BungeeCord java -jar /home/ridog/BungeeCord/BungeeCord.jar"

решение1

Вызов экрана через upstart действительно несколько сложен. Первая проблема с несуществующим /var/run/screenможет быть легко решена.

В Ubuntu 10.10–13.10 есть задача upstart, которая отвечает за очистку и (повторное) создание /var/run/screenпри загрузке, поэтому вам нужно убедиться, что ваш скрипт upstart будет запущен после нее:

start on stopped screen-cleanup

В Ubuntu 10.04 и более ранних версиях, а также в Ubuntu 14.04 и более поздних версиях этот код находится в скрипте инициализации, /etc/init.d/screen-cleanupчто означает, что задания upstart могут ссылаться на него как на результат rc:

start on stopped rc

Однако screen, вероятно, все еще будет жаловаться на разрешения /var/run/screen. Это можно обойти, вызвав screen через setsid:

exec setsid screen -Dm /some/command

Ваш сеанс screen будет разветвляться один раз, поэтому вам нужно добавить строку «expect fork», чтобы убедиться, что upstart следует правильному pid.

Вот полный пример скрипта (требуется как минимум Ubuntu 12.04):

# screen startup script
# requires upstart v1.4 or newer

description "running top in screen session"

start on ( local-filesystems
           and stopped rc )
stop on runlevel [!2345]

respawn

setuid test
setgid test

# "setsid screen -Dm" only forks once
expect fork

# use setsid to avoid screen complaining about /var/run/screen permissions.
exec setsid screen -Dm -S mytopsession /usr/bin/top

решение2

Прежде чем совершать вызов, создайте его /var/run/screenс rootсоответствующими разрешениями screen.

решение3

Задача решена, я перешел с использования upstartна использование cron. Это было намного проще и теперь все работает отлично.

Для тех, кто читает это и кому может быть интересно, как я это сделал, я сделал простое shell script:

#!/bin/bash
java -Xms256M -Xmx256M -jar /home/ridog/BungeeCord/BungeeCord.jar

И настройте его на запуск при запуске с помощью новой строки crontab -e:

@reboot screen -dmS BungeeCord sh /home/ridog/BungeeCord/run.sh

Спасибо за вашу помощь!

Связанный контент