5

У меня есть старый скрипт initd для запуска моего приложения. Он работал нормально под старыми версиями SuSE, но не работает на Open SuSE 12.3.

Странная вещь

cd /etc/init.d ; ./script start

работает отлично.

/etc/init.d/script start

показывает перенаправление на systemctl, но не запускает мое приложение (а также не показывает никакого вывода из скрипта initd).

Я не вижу записей в журнале, показывающих, что идет не так. Единственная запись, которую я вижу, находится в /var /log /messages, сообщая, что приложение было запущено.

Как мне отладить это?

3 ответа3

2

Пара вещей.

  1. Запустите команду с чистой средой:

    env -i PATH=/usr/sbin:/sbin:/usr/bin:/bin /etc/init.d/SCRIPT start
    
  2. Во-вторых, включите отладку оболочки. Один простой способ сделать это с помощью:

    bash -x SCRIPT start
    

комбинируя два, вы получите:

    env -i PATH=/usr/sbin:/sbin:/usr/bin:/bin bash -x /etc/init.d/SCRIPT start
  1. Отключите режим совместимости systemd с:

    SYSTEMCTL_SKIP_REDIRECT=true
    

Имя этой переменной может отличаться. Ваш сценарий инициализации, вероятно, включает в себя что-то вроде

    . /etc/sysconfig/functions

Этот файл проверит вышеуказанную переменную среды. (Suse немного отличается от своих двоюродных братьев, основанных на RedHat, так что YMMV).

Сочетая все вышеперечисленное:

env -i PATH=/usr/sbin:/sbin:/usr/bin:/bin SYSTEMCTL_SKIP_REDIRECT=true  \
bash -x /etc/init.d/SCRIPT start

Наконец, поскольку вывод будет объемным, добавьте следующее:

2>&1 | less -r +F

Чем less программа будет буферизировать вывод, позволяя вам прокрутить всю историю назад. Нажмите CTRL-C чтобы выйти из режима "следовать", чтобы иметь возможность прокрутки назад и т.д.

1

Причина, по которой сценарий имеет такое поведение, заключается в том, что OpenSuse 12.3 заменил старый sysvinit на systemd, систему управления системой, которая контролирует весь процесс загрузки.

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

sudo systemctl enable/disable your-service

включает или отключает его, и, как правило,

sudo systemctl start/stop/status your-service

запускает, останавливает, запрашивает его статус.

Типичный скрипт нестандартного сервиса находится в папке /etc /systemd /system, заканчивается суффиксом .service и имеет следующий формат:

 [Unit]
 Description=sdbarker.com Chiliproject
 Requires=mysqld.service nginx.service
 Wants=mysqld.service nginx.service

 [Service]
 User=www-data
 WorkingDirectory=/path/to/chiliproject/install
 ExecStart=/usr/bin/bundle 
 PIDFile=/path/to/chiliproject/install/tmp/pids/server.pid

 [Install]
 WantedBy=multi-user.target

Как видите, большинство записей говорят сами за себя. Не зная больше о вашем скрипте, я не могу оказать дополнительную помощь, но вы найдете на этой странице Arch Linux Wiki информацию, необходимую для написания правильного скрипта пользовательского сервиса.

0

Скорее всего, в /etc/init.d/script есть относительный путь, который не относится к /etc/init.d/. Вы можете поместить содержимое скрипта здесь (если только он не очень большой).

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .