Назад | Перейти на главную страницу

Нужна помощь в преобразовании служебных скриптов init.d в systemd (CentOS)

Я потратил несколько дней на решение вопроса, который меня очень расстраивает, и у меня нет других вариантов.

В настоящее время я использую сервер CentOS 6.8 для работы на нашем веб-сайте. CentOS 6 (Enterprise Linux 6 или EL6) использует старую модель init.d для сценариев запуска. Есть программа, которую требует от меня мой начальник, SonicWALL CDP Agent. У него есть сервер резервного копирования SonicWALL, а их «агентское» программное обеспечение работает в фоновом режиме для резервного копирования определенных файлов и папок на сервер. Фактически он построен на Acronis TrueImage, но это уже другая история.

Самая большая проблема в том, что их агент CDP использует Adobe AIR. Они, должно быть, спроектировали его таким образом, чтобы он был кроссплатформенным (поскольку у них есть установщик для Windows / OSX / Linux), но, конечно, Adobe некоторое время назад полностью прекратила поддержку AIR в 64-битной Linux. На их сайте приведены некоторые шаги по его установке, но это восходит к Red Hat 5.5, а не даже 6.

Мне удалось установить AIR на EL7, выполнив шаги для EL6, и просто отметив, где в репозиториях изменились имена пакетов. Интересно отметить, что обычный установщик с графическим интерфейсом пользователя (AdobeAIRInstaller.bin) не работает и выдает некоторую ошибку о том, что «может быть, ваш администратор запрещает установку» даже при запуске с правами root), но файлы .rpm работают.

У меня самые свежие:
adobeair-core-2.6.0-19170.noarch.rpm
adobeair-2.6.0-19170.i686.rpm

В сочетании с библиотеками GTK2 i686 это действительно работает.

Однако агент CDP сложнее этого. Есть две системные службы, которые необходимо запустить, чтобы программное обеспечение агента действительно работало (и, если подумать, это потребуется для работы автоматического резервного копирования в любом случае.)

Однако их установщику уже несколько лет, и он помещает сценарии запуска в init.d. Это «должно» работать в EL7, но это не так. Я часами возился с этим, и это просто не работает.

Итак, в основном, есть два двоичных файла, которые необходимо запустить. Команды для их запуска:

/sbin/cdp/cdpagentproxy  
/sbin/cdp/cdpdaemon start  

Если я открываю терминал и запускаю их вручную, они работают - я могу открыть агент CDP, и он работает. Однако они не запускаются при загрузке из-за несовместимости init.d / systemd.

Поэтому я сделал пару простых «сервисов» и разместил их в нужных местах. Файл cdpdaemon.service, например:

[Unit]
Description=CDP Daemon Service
After=syslog.target network.target

[Service]
Type=forking
ExecStart=/sbin/cdp/cdpdaemon start

[Install]
WantedBy=multi-user.target

Я поместил это в /usr/lib/systemd/system/cdpdaemon.service и сделал на него символическую ссылку в /etc/systemd/system/multi-user.target.wants/cdpdaemon.service.

Но вот что происходит, когда я пытаюсь проверить статус:

[root@localhost Desktop]# systemctl status cdpdaemon.service
● cdpdaemon.service - CDP Daemon Service
   Loaded: loaded (/usr/lib/systemd/system/cdpdaemon.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Sun 2016-08-21 22:08:13 EDT; 10s ago
      Process: 1596 ExecStart=/sbin/cdp/cdpdaemon start (code=exited, status=0/SUCCESS)
 Main PID: 1633 (code=exited, status=127)

Aug 21 22:08:13 localhost.localdomain systemd[1]: Starting CDP Daemon Service...
Aug 21 22:08:13 localhost.localdomain cdpdaemon[1596]: Starting  process.
Aug 21 22:08:13 localhost.localdomain systemd[1]: Started CDP Daemon Service.
Aug 21 22:08:13 localhost.localdomain systemd[1]: cdpdaemon.service: main process exited, code=exited, status=127/n/a
Aug 21 22:08:13 localhost.localdomain systemd[1]: Unit cdpdaemon.service entered failed state.
Aug 21 22:08:13 localhost.localdomain systemd[1]: cdpdaemon.service failed.

Другой делает то же самое. Похоже, он пытается запустить, но затем останавливается и сообщает об ошибке. Если я открою терминал и просто наберу /sbin/cdp/cdpdaemon start, он отлично работает.

Я что-то здесь делаю не так? Я не понимаю различных типов «целевых» вариантов, «после» и типа. (Я в основном взял рабочий сервис, скопировал текст и изменил команду)

Я полагаю, что другой вариант - создать задание cron, которое запускается в определенное время (скажем, в 11 вечера, если резервное копирование выполняется в полночь), которое запускает две команды, но это кажется неправильным способом сделать это.

Программа ДЕЙСТВИТЕЛЬНО запускается, я просто не могу заставить ее работать самостоятельно без запуска двух вспомогательных процессов.

Изменить: я думал, что предоставлю установочный файл .sh на случай, если это поможет. Вы можете видеть, где он проверяет, какой дистрибутив вы используете, и создает сценарии init.d.

http://pastebin.com/FmrZcmcR

Вернемся на секунду назад.

Процесс sonicwall несовместим с RHEL / Centos7.

Остановить там. Передайте это прекрасным людям из Sonicwall для исправления; Это именно то, за что вы должны платить им лицензионные сборы, и они (должны) иметь опыт, чтобы поддерживать свое программное обеспечение в таком виде.

CentOS6 будет поддерживаться еще полдесятилетия, но им следует начать переход на eeeeeasy.

Во-первых, определите, выполняются ли эти процессы вилкой или нет. Если вы запускаете процесс «разветвления» в терминале, он освобождает терминал и «переходит в фоновый режим». Такие процессы требуют Type=forking. В противном случае, если процесс не освобождает терминал, пока вы не завершите его с помощью Ctrl + C или не поместите & в конце командной строки, то это Type=simple. Это так просто.

Во-вторых, вы упомянули, что есть два процессы, которые необходимо запустить по порядку. Вы писали файлы модулей для них обоих? Если нет, то сделайте это прямо сейчас.

В-третьих, не забывайте о зависимостях. Если последний процесс (/sbin/cdp/cdpdaemon start) зависит от первого (/sbin/cdp/cdpagentproxy), то вам нужно выразить требования и зависимости между ними в файлах модулей.

Если, например, созданные вами файлы модулей названы cdpagentproxy.service и cdpdaemon.service соответственно, вы должны поместить эти строки в свой cdpdaemon.service файл модуля:

[Unit]
Requires=cdpagentproxy.service
After=cdpagentproxy.service

(Поместите эти строки внутри существующего [Unit] раздел, конечно. Я включил заголовок раздела только для полноты.)

Тогда беги systemctl daemon-reload, завершите оба процесса и попробуйте запустить модуль вручную или просто добавьте его в автозапуск и перезагрузите.

«Type = fokring» предназначен для служб, которые разветвляют дочерний элемент и помещают его в фоновый режим, а сами завершаются нормально. Глядя на ваш вывод, кажется, что ваши программы этого не делают. что произойдет, если вы измените "Type = forking" на "Type = simple"?