Jaki jest najprostszy sposób, aby mój stary skrypt init działał w systemie?

48

Nie chcę robić tego dobrze, tworząc nowy skrypt systemowy, chcę tylko, aby mój stary skrypt init znów działał po uaktualnieniu systemu do systemu operacyjnego, który używa systemd.

Krótko zbadałem, jak konwertować skrypty inicjujące i jak pisać skrypty systemowe, ale jestem pewien, że nauczenie się tego poprawnie i zrobienie tego we właściwy sposób zajmie mi kilka godzin.

Obecna sytuacja to:

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

I:

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

Teraz chcę tylko wrócić do pracy. Jaka jest ścieżka najmniejszego oporu przed ponownym uruchomieniem ?

Aktualizacje

Nie chciałem tego wszystkiego rozgryźć - naprawdę tego nie zrobiłem - ale muszę i odkryłem moją pierwszą wskazówkę:

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.

Strona niezgodności dla systemd mówi, że:

Informacje o zależności nagłówka LSB mają znaczenie. Implementacje SysV w wielu dystrybucjach nie wykorzystywały informacji o zależnościach zakodowanych w nagłówkach skryptu inicjującego LSB lub wykorzystywały je tylko w bardzo ograniczonym zakresie. Z tego powodu są często niepoprawne lub niekompletne. systemd jednak w pełni interpretuje te nagłówki i ściśle je śledzi w czasie wykonywania

Myślę, że to oznacza, że ​​mój skrypt nie będzie działał, dopóki nie zostanie naprawiony.

Skrypt, o którym mowa:

#!/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
źródło
„Nie chcę postępować właściwie” dostarczy wielu negatywnych opinii. Mam nadzieję, że założyłeś kombinezon przeciwgazowy. W każdym razie ścieżka najmniejszego oporu jest niczym ; po prostu użyj skryptu init.
Michael Hampton
6
Pewnego dnia zrobię właściwą rzecz. Ale żyjemy w świecie ograniczonych zasobów. Dodałem więcej szczegółów na temat tego, co nie działa, ponieważ najwyraźniej ma to już działać.
mlissner,
Próbujesz to zrobić na Ubuntu? Niech Bóg ci pomoże, dlaczego?
Michael Hampton
1
Jestem. Czy to jest gorsze niż gdziekolwiek indziej?
mlissner
1
Wśród wszystkich innych wad Ubuntu istotną tutaj jest to, że Upstart był koszmarnym koszmarem. To dobrze, że są one ostatecznie pozbycie się go, ale skrypt startowych , jak to naprawdę nie jest z nim zgodne. To, jak wcześniej działało, jest najprawdopodobniej dzięki (starożytnej) kompatybilności SysV i chociaż systemd może sobie z tym poradzić, Ubuntu najwyraźniej zrobił coś, aby to naprawić. Nie polecam próbowania tego, aby działało, zwłaszcza, że ​​napisanie pliku jednostki systemowej zajęłoby ci o wiele mniej czasu niż na to.
Michael Hampton

Odpowiedzi:

34

Poważnie, systemowy plik jednostki jest prosty do napisania dla takiej usługi ... lub dla większości usług.

To powinno zapewnić ci około 95% drogi. Umieść to na przykład/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

Zwróć uwagę na rzeczy, których tu nie ma, takie jak plik dziennika itp .; systemd automatycznie przechwytuje i rejestruje dane wyjściowe usługi pod nazwą usługi.

Michael Hampton
źródło
5
Cóż, zajęło mi to mniej więcej cały dzień, aby zostać poprawionym i skonfigurowanym i wszystko. systemdma pewne osobliwości, na przykład ten skrypt nie będzie miał trwałych dzienników, dopóki go nie włączysz. W końcu to działa, a twoje wsparcie było tym, czego potrzebowałem, dzięki.
mlissner
15

Dla mnie łatwiej było po prostu dodać blok informacyjny init w nagłówku, jak sugerowano tutaj :

#!/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

Następnie wykonaj sudo systemctl enable solr.

eadmaster
źródło
1
W kodzie masz literówkę, która jest taka sama, jak ja i uniemożliwiała mi działanie skryptu (otrzymując w ten sposób niesławny "contains no runlevels, aborting"błąd), dopóki nie zdałem sobie z tego sprawy: brakujący trzeci # w drugiej linii (powinien być ### BEGIN INIT INFO). Założę się, że to również wyjaśnia, dlaczego masz tak mało głosów.
Pere
1
Ups, masz rację, prawdopodobnie został usunięty w procesie kopiuj-wklej! (teraz naprawiony)
eadmaster
7

Inne rozwiązanie użycia starszego skryptu inicjującego Solr z systememd:

systemctl daemon-reload  
systemctl enable solr  
systemctl start solr  
grégory eve
źródło
1
On już próbował, że i to nie działa, bo Ubuntu jest wadliwy.
Michael Hampton
4

Bardziej wygodne jest uruchamianie Solr przy użyciu dostarczonego skryptu startowego .

Plik jednostki systemowej wygląda następująco:

[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

Pamiętaj, że możesz również skorzystać ze zmiennych środowiskowych, dodając EnvironmentFiledo [Service]sekcji. Skrypt uwzględnia bin/solrzmienne środowiskowe, wystarczy spojrzeć na nie.

Jiří Kozlovský
źródło
Dzisiaj jest dobrze. W momencie, gdy pytanie było pierwotnie napisane, nie było dostarczonej systemowej jednostki dla Solr.
Michael Hampton
1

Testowane na Debianie: Dodaj „_SYSTEMCTL_SKIP_REDIRECT = OHYES” na początku skryptu.

Fanom systemowym może się to nie podobać, ale hej, nie lubię systemd, więc proszę :).

Guy Egozy
źródło
lub SYSTEMCTL_SKIP_REDIRECT=truew redhat
Otheus
nie działało dla mnie :(
eadmaster
Upewnij się, że dodatek _(podkreślenia), zanim SYSTEMCTLcoś takiego: _SYSTEMCTL_SKIP_REDIRECT=1. Jeśli spróbujesz tego z wiersza poleceń, musisz również wyeksportować ten var.
timurb
1

Miałem ten sam błąd podczas próby użycia skryptu inicjującego LSB na CentOS 7. Przyczyną root okazało się, że skrypt był dowiązaniem symbolicznym. Po zastąpieniu kopią oryginału wszystko działało dobrze.

gatopeich
źródło
Tak też mogło być w przypadku mojego skryptu.
mlissner,