Услуги Systemd, не работающие

Я просто переключился на 16,04 серверов с 14,04 серверов. С Выскочкой я раньше запускал мой сервер с файла, который я имел в/etc/rcS.d по имени M95. M95 назвал/etc/rc.local. Теперь с systemd я записал файл в/etc/systemd/system, названном my.service. Это похоже на это:

[Unit]
Description=MyService

[Service]
WorkingDirectory=/etc
ExecStart=/bin/sh rc.local

[Install]
WantedBy=multi-user.target

Когда я ввожу "/bin/sh rc.local" в командную строку, мой сервер действительно запускается. Когда я пытаюсь запуститься, сервис путем выполнения "systemctl запускают my.service", ничего не происходит.

Соответствующие строки в journalctl-b:

Started MyService.
eth0 ...(basically the info I see from ifconfig)
root : TTY=unknown ; PWD=/etc ; USER=root ; COMMAND=/etc/rcS.d/M95
pam_unix(sudo:session): session opened for user root by (uid=0)
$File not found:: /new/den-routes
udhcpd already running
pam_unix(sudo:session): session closed for user root
/bin/rm: cannot remove '/var/log/rewriting-net-rules': No such file or directory.

В rc.local это похоже:

#!/bin/sh -e
...
sudo /etc/rcS.d/M95
/bin/rm /var/log/rewriting-net-rules

exit 0

В M95 это запускает udhcpd (который является, куда "udhcpd уже выполняющий" сообщение прибывает из), и в конце запускает сервер путем высказывания:

cd /new
/bin/sh StartServer&

Кажется, что это действительно добирается до M95, потому что сообщения становятся зарегистрированными от него, но сервер не запускается. Когда я петляю в командной строке, она работает, но как сервис она не работает. Я очень незнаком с systemd, таким образом, я понятия не имею, делаю ли я это правильно. В течение недели я читал примеры и учебные руководства для него, но я все еще не уверен, как это работает и как сервисный файл должен быть записан.

Править: Вот мой файл StartServer:

#!/bin/bash
nohup /jre/jdk1.8.0_101/jre/bin/myserver -Xrs -Xmx1000m -jar /new/MyServer.jar nowd &

Это работает очень хорошо, когда я запускаю его с командной строки. Это работает, когда я называю его от my.service. Я вставил некоторый echos, чтобы видеть, что он проходит через целый файл, но myserver и MyServer.jar не запускаются по некоторым причинам.

1
задан 30 September 2016 в 16:04

2 ответа

Оказалось, что проблема была в части кода в rc.local. Строка, что кто-то вставил попытку удалить файл, произвела бы ошибку и заставила бы программу выходить, если бы файл не существовал. Я не уверен, почему это не произвело эту ошибку, когда я выполнил его в командной строке, но, выполнено с помощью сервиса, это мешало всему работать.

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

0
ответ дан 3 December 2019 в 06:57

Мое совершенство, существует много вещей неправильно здесь.

  • Вы не выполняете свой сервис непосредственно; но вместо этого Ваша сервисная единица выполняет оболочку, которая интерпретирует rc.local в рабочем каталоге /etc. Это несмотря на то, что systemd имеет предварительно предоставленную сервисную единицу для выполнения /etc/rc.local, если Вы действительно хотите. (rc.local механизм, который был заменен три раза на Ubuntu, сначала van Smoorenburg rc, затем выскочкой, затем systemd.)
  • , Но /etc/rc.local не выполняет Ваш сервис также. Вместо этого это вызов sudo, несмотря на то, что это уже выполнение как суперпользователь.
  • Это в свою очередь запускает (второй) скрипт от /etc/rcS.d, несмотря на то, что каталог является фермой символьной ссылки, которая, как предполагается, не содержит фактический rc файлы сценария.
  • , Что сценарий работает вручную dæ Монс, который systemd ясно уже выполняет как практическая эксплуатация.
  • Это думает, что рабочий каталог должен быть /new не /etc.
  • , Но даже который не является Вашим сервисом. Вместо этого это разветвляет оболочку для интерпретации третьего сценария, названного StartServer.
  • Это не использует exec для накладывания себя.
  • Это использует & для выполнения той оболочки асинхронно.
  • , Что четвертый сценарий затем разветвляет и запускает программу Java.
  • Это также не использует exec для накладывания себя.
  • И обледенение на пироге то, что это также использование & для запущения той программы Java асинхронно.

Ни одно из этого не необходимо.

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

[Unit]
Documentation=https://askubuntu.com/a/831314/43344
After=udhcpd.service

[Service]
WorkingDirectory=/new
ExecStart=/jre/jdk1.8.0_101/jre/bin/myserver -Xrs -Xmx1000m -jar /new/MyServer.jar nowd

[Install]
WantedBy=multi-user.target

существует также ясно After= дополнение, необходимое для того, что это, это выписывает den-routes файл что Ваш dæ понедельник ожидает; Вы, однако, не предоставляя информации для определения, каково это.

Дополнительные материалы для чтения

4
ответ дан 3 December 2019 в 06:57

Другие вопросы по тегам:

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