Я пытаюсь создать задание 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
Спасибо за вашу помощь!