Какой самый простой способ заставить мой старый скрипт init работать в systemd?

49

Я не хочу делать правильные вещи, создав новый сценарий systemd, я просто хочу, чтобы мой старый сценарий инициализации снова заработал теперь, когда я обновил свою систему до ОС, использующей systemd.

Я кратко исследовал, как преобразовать сценарии инициализации и как писать сценарии systemd, но я уверен, что изучение и правильное выполнение этого заняло бы у меня несколько часов.

Текущая ситуация:

systemctl start solr
Failed to start solr.service: Unit solr.service failed to load: No such file or directory.

А также:

sudo service solr start
Failed to start solr.service: Unit solr.service failed to load: No such file or directory.

Прямо сейчас я просто хочу вернуться к работе. Каков путь наименьшего сопротивления, чтобы снова заработать?

Обновления

Я не хотел выяснять это все - я действительно не сделал - но я должен, и я нашел свою первую подсказку:

sudo systemctl enable solr
Synchronizing state for solr.service with sysvinit using update-rc.d...
Executing /usr/sbin/update-rc.d solr defaults
insserv: warning: script 'K01solr' missing LSB tags and overrides
insserv: warning: script 'solr' missing LSB tags and overrides
Executing /usr/sbin/update-rc.d solr enable
update-rc.d: error: solr Default-Start contains no runlevels, aborting.

Страница несовместимости для systemd сообщает, что:

Информация о зависимостях заголовка LSB имеет значение. Реализации SysV во многих дистрибутивах не использовали информацию о зависимостях, закодированную в заголовках сценария инициализации LSB, или использовали их только очень ограниченным образом. В связи с этим они часто являются неправильными или неполными. Однако systemd полностью интерпретирует эти заголовки и внимательно следит за ними во время выполнения.

Я думаю, это означает, что мой сценарий не будет работать, пока не будет исправлено.

Сценарий в вопросе:

#!/bin/sh

# Prerequisites:
# 1. Solr needs to be installed at /usr/local/solr/example
# 2. daemon needs to be installed
# 3. Script needs to be executed by root
# 4. $INSTALL_ROOT must be set

# This script will launch Solr in a mode that will automatically respawn if it
# crashes. Output will be sent to /var/log/solr/solr.log. A pid file will be
# created in the standard location.

start () {
    echo -n "Starting solr..."

    # Reset ulimit or else get issues with too many open files (https://issues.apache.org/jira/browse/SOLR-4)
    ulimit -n 10000

    # start daemon
    daemon --chdir='/usr/local/solr/example' --command "java -jar -server start.jar -DINSTALL_ROOT=$INSTALL_ROOT" --respawn --output=/var/log/solr/solr.log --name=solr --verbose

    RETVAL=$?
    if [ $RETVAL = 0 ]
    then
        echo "done."
    else
        echo "failed. See error code for more information."
    fi
    return $RETVAL
}

stop () {
    # stop daemon
    echo -n "Stopping solr..."

    daemon --stop --name=solr  --verbose
    RETVAL=$?

    if [ $RETVAL = 0 ]
    then
        echo "done."
    else
        echo "failed. See error code for more information."
    fi
    return $RETVAL
}


restart () {
    daemon --restart --name=solr  --verbose
}


status () {
    # report on the status of the daemon
    daemon --running --verbose --name=solr
    return $?
}


case "$1" in
    start)
        start
    ;;
    status)
        status
    ;;
    stop)
        stop
    ;;
    restart)
        stop
        sleep 15
        start
    ;;
    *)
        echo $"Usage: solr {start|status|stop|restart}"
        exit 3
    ;;
esac

exit $RETVAL
mlissner
источник
«Я не хочу делать правильные вещи» собирается получить много негативных отзывов. Надеюсь, ты надел свой костюм от hazmat. Во всяком случае, путь наименьшего сопротивления ничто ; просто используйте свой скрипт инициализации.
Майкл Хэмптон
6
Однажды, конечно, я поступлю правильно. Но мы живем в мире ограниченных ресурсов. Я добавил более подробную информацию о том, что не работает, так как, очевидно, это должно работать уже.
mlissner
Вы пытаетесь сделать это на Ubuntu? Бог тебе в помощь, почему?
Майкл Хэмптон
1
Я. Это хуже, чем где-либо еще?
mlissner
1
Среди всех других недостатков Ubuntu, уместным здесь является то, что Upstart был ужасным кошмаром. Это хорошо , что они наконец - то избавиться от него, но ваш сценарий инициализации , как это на самом деле не совместим с ним. То, как это работало раньше, скорее всего, благодаря (древней) совместимости с SysV, и хотя systemd может справиться с этим, Ubuntu, очевидно, предпринял что-то, чтобы сломать его. Я не буду рекомендовать пытаться сделать эту работу, тем более что вам понадобилось бы гораздо меньше времени на написание файла системного модуля, чем вы уже потратили на это.
Майкл Хэмптон

Ответы:

34

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

Это должно дать вам около 95% пути туда. Поместите это, например, в/etc/systemd/system/solr.service

[Unit]
Description=Apache Solr
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=simple
EnvironmentFile=/etc/courtlistener
WorkingDirectory=/usr/local/solr/example
ExecStart=/usr/bin/java -jar -server -Xmx${CL_SOLR_XMX} start.jar -DINSTALL_ROOT=${INSTALL_ROOT}
Restart=on-failure
LimitNOFILE=10000

[Install]
WantedBy=multi-user.target

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

Майкл Хэмптон
источник
5
Ну, это заняло у меня более или менее целый день, чтобы настроить и настроить и все такое. systemdимеет некоторые странности, например, этот скрипт не будет иметь постоянных журналов, если вы не включите его. В конце концов, это работает, и ваш толчок был тем, что мне было нужно, спасибо.
mlissner
15

Для меня было проще просто добавить информационный блок init в заголовок, как предложено здесь :

#!/bin/sh
### BEGIN INIT INFO
# Provides:          solr
# Required-Start:    
# Required-Stop:     
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: solr
# Description:       solr
### END INIT INFO

Затем выполните sudo systemctl enable solr.

eadmaster
источник
1
В вашем коде есть опечатка, которая совпадает с той, что была у меня, и мешала моему скрипту работать (таким образом получая печально известную "contains no runlevels, aborting"ошибку), пока я не осознал это: пропущенный третий # во второй строке (так и должно быть ### BEGIN INIT INFO). Бьюсь об заклад, это также объясняет, почему у вас так мало голосов.
Pere
1
К сожалению, вы правы, вероятно, он был удален в процессе копирования-вставки! (исправлено сейчас)
eadmaster
7

Другое решение использовать устаревший скрипт инициализации solr с systemd:

systemctl daemon-reload  
systemctl enable solr  
systemctl start solr  
канун Грегори
источник
1
Он уже попробовал это, и это не сработало, потому что Ubuntu глючит.
Майкл Хэмптон
4

Удобнее запустить Solr, используя предоставленный стартовый скрипт .

Файл системного модуля выглядит следующим образом:

[Unit]
Description=Apache Solr for Nextcloud's nextant app fulltext indexing
After=syslog.target network.target remote-fs.target nss-lookup.target systemd-journald-dev-log.socket
Before=nginx.service

[Service]
Type=forking
User=solr
WorkingDirectory=/path/to/solr/server
ExecStart=/path/to/solr/bin/solr start
ExecStop=/path/to/solr/bin/solr stop
Restart=on-failure

[Install]
WantedBy=multi-user.target

Обратите внимание, что вы также можете использовать переменные среды, добавив EnvironmentFileв [Service]раздел. Скрипт bin/solrучитывает переменные окружения, просто посмотрите на него.

Иржи Козловский
источник
Это хорошо сегодня. В то время, когда вопрос был изначально написан, не было предоставленного системного блока для Solr.
Майкл Хэмптон
1

Протестировано в Debian: добавьте '_SYSTEMCTL_SKIP_REDIRECT = OHYES' в начале скрипта.

Системным фанатам это может не понравиться, но эй, я не люблю systemd, так что там :).

Парень эгози
источник
или SYSTEMCTL_SKIP_REDIRECT=trueв redhat
Otheus
у меня не сработало :(
eadmaster
Убедитесь , что вы добавляете _(подчеркивание) , прежде чем SYSTEMCTL, как это: _SYSTEMCTL_SKIP_REDIRECT=1. Если вы попробуете это из командной строки, вам также необходимо экспортировать эту переменную.
Тимур
1

У меня была та же ошибка при попытке использовать скрипт инициализации LSB в CentOS 7. Основной причиной оказалось то, что скрипт был символической ссылкой. После замены на копию оригинала все работало нормально.

gatopeich
источник
Это могло быть так и для моего сценария.
mlissner