Який найпростіший спосіб змусити старий скрипт init працювати в systemd?


48

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

Я коротко дослідив, як перетворити скрипти init та як писати системні сценарії, але я впевнений, що для його правильного навчання та правильного виконання знадобиться кілька годин.

Поточна ситуація:

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

"Я не хочу робити все правильно", це отримає у вас багато негативних відгуків. Сподіваюся, ви наділи свій костюм hazmat. У будь-якому випадку шлях найменшого опору - це ніщо ; просто використовуйте свій сценарій init.
Майкл Хемптон

6
Одного разу, безумовно, я зроблю правильно. Але ми живемо у світі обмежених ресурсів. Я додав детальніше про те, що не працює, оскільки, мабуть, це вже працює.
mlissner

Ви намагаєтесь це зробити на Ubuntu? Бог вам допоможе, чому?
Майкл Хемптон

1
Мені. Це гірше, ніж де-небудь ще?
mlissner

1
Серед усіх інших невдач Ubuntu, релевантним тут є те, що Upstart був поважним кошмаром. Добре, що вони, нарешті, позбавляються від нього, але ваш сценарій init як насправді не сумісний з ним. Як це працювало раніше, швидше за все, завдяки (старовинній) сумісності 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.


1
У вас є помилка друку у вашому коді, яка була такою ж, як у мене, і заважала моєму сценарію працювати (таким чином отримуючи сумнозвісну "contains no runlevels, aborting"помилку), поки я не зрозумів це: відсутній третій номер # у вашому другому рядку (це має бути ### BEGIN INIT INFO). Я думаю, що це також пояснить, чому у вас так мало голосів.
Пер

1
oops, ви праві, ймовірно, це було видалено в процесі копіювання-вставки! (виправлено зараз)
eadmaster


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
Отей

не працював для мене :(
eadmaster

Переконайтеся , що ви додаєте _(підкреслення) , перш ніж SYSTEMCTL, як це: _SYSTEMCTL_SKIP_REDIRECT=1. Якщо ви спробуєте це з командного рядка, вам також потрібно експортувати цей вар.
тимбур

1

У мене була така ж помилка при спробі використання скрипта init LSB на CentOS 7. Основна причина виявилася в тому, що скрипт був символічним посиланням. Як тільки замінили на копію оригіналу, все працювало чудово.


Це могло бути і для мого сценарію.
mlissner
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.