Apa cara termudah untuk membuat skrip init lama saya berfungsi di systemd?

48

Saya tidak ingin melakukan hal yang benar dengan membuat skrip systemd baru, saya hanya ingin skrip init lama saya bekerja lagi sekarang karena saya telah memutakhirkan sistem saya ke OS yang menggunakan systemd.

Saya telah meneliti secara singkat cara mengkonversi skrip init dan cara menulis skrip systemd, tapi saya yakin mempelajarinya dengan benar dan melakukannya dengan benar akan memakan waktu beberapa jam.

Situasi saat ini adalah:

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

Dan:

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

Saat ini, saya hanya ingin kembali bekerja. Apa jalan perlawanan paling tidak untuk membuat ini bekerja lagi?

Pembaruan

Saya tidak ingin memikirkan ini semua - saya benar-benar tidak - tetapi saya harus dan saya telah menggali petunjuk pertama saya:

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.

The halaman tidak kompatibel untuk systemd mengatakan bahwa:

Informasi dependensi header LSB penting. Implementasi SysV pada banyak distribusi tidak menggunakan informasi dependensi yang dikodekan dalam header skrip init LSB, atau menggunakannya hanya dengan cara yang sangat terbatas. Karena itu mereka sering salah atau tidak lengkap. Namun systemd sepenuhnya menafsirkan header ini dan mengikutinya secara dekat saat runtime

Saya pikir itu berarti skrip saya tidak akan berfungsi sampai itu diperbaiki.

Script yang dipertanyakan:

#!/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
sumber
"Saya tidak ingin melakukan hal yang benar" akan memberi Anda banyak umpan balik negatif. Semoga Anda mengenakan setelan hazmat Anda. Ngomong-ngomong, jalan perlawanan paling tidak ada artinya ; cukup gunakan skrip init Anda.
Michael Hampton
6
Suatu hari, tentunya, saya akan melakukan hal yang benar. Tetapi kita hidup di dunia dengan sumber daya yang terbatas. Saya telah menambahkan lebih detail tentang apa yang tidak berfungsi, karena tampaknya ini sudah berfungsi.
mlissner
Apakah Anda mencoba melakukan ini di Ubuntu? Tuhan membantumu, mengapa?
Michael Hampton
1
Saya. Apakah itu lebih buruk daripada di tempat lain?
mlissner
1
Di antara semua kegagalan Ubuntu lainnya, yang relevan di sini adalah bahwa Upstart adalah mimpi buruk yang luar biasa. Itu baik bahwa mereka akhirnya mendapatkan menyingkirkan itu, tapi skrip init anda seperti tidak benar-benar kompatibel dengan itu. Cara kerjanya sebelumnya kemungkinan besar melalui kompatibilitas SysV (kuno), dan sementara systemd dapat menangani ini, Ubuntu tampaknya telah melakukan sesuatu untuk memecahkannya. Saya tidak akan merekomendasikan mencoba membuat ini bekerja, terutama karena itu akan membawa Anda jauh lebih sedikit waktu untuk menulis file systemd unit daripada yang sudah Anda habiskan untuk ini.
Michael Hampton

Jawaban:

34

Serius, file unit systemd sepele untuk ditulis untuk layanan seperti ini ... atau untuk sebagian besar layanan.

Ini seharusnya membuat Anda sekitar 95% dari perjalanan ke sana. Masukkan ini ke dalam, misalnya,/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

Perhatikan hal-hal yang tidak ada di sini, seperti file log dan semacamnya; systemd akan secara otomatis menangkap dan mencatat output layanan dengan nama layanan.

Michael Hampton
sumber
5
Yah, ini membuat saya kurang lebih sepanjang hari untuk mendapatkan tweak dan konfigurasi dan segalanya. systemdmemiliki beberapa keanehan, seperti skrip ini tidak akan memiliki log yang persisten kecuali Anda mengaktifkannya. Pada akhirnya, itu berhasil dan dorongan Anda adalah yang saya butuhkan, terima kasih.
mlissner
15

Bagi saya lebih mudah untuk hanya menambahkan blok info init di header seperti yang disarankan di sini :

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

Kemudian, jalankan sudo systemctl enable solr.

eadmaster
sumber
1
Anda memiliki kesalahan ketik pada kode Anda yang kebetulan sama dengan yang saya miliki dan mencegah skrip saya berfungsi (sehingga mendapatkan "contains no runlevels, aborting"kesalahan terkenal ) sampai saya menyadarinya: # ketiga hilang di baris kedua Anda (seharusnya ### BEGIN INIT INFO). Saya bertaruh itu juga akan menjelaskan mengapa Anda memiliki begitu sedikit suara juga.
Pere
1
oops, Anda benar, mungkin itu dihapus dalam proses salin-tempel! (diperbaiki sekarang)
eadmaster
7

Solusi lain untuk menggunakan skrip init solr legacy dengan systemd:

systemctl daemon-reload  
systemctl enable solr  
systemctl start solr  
malam yang menyenangkan
sumber
1
Dia sudah mencobanya, dan itu tidak berhasil, karena Ubuntu bermasalah.
Michael Hampton
4

Lebih nyaman menjalankan Solr menggunakan skrip start yang disediakan .

File unit systemd terlihat seperti ini:

[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

Perhatikan bahwa Anda juga dapat menggunakan variabel lingkungan Anda dengan menambahkan EnvironmentFileke [Service]bagian. Script bin/solrmenghormati variabel lingkungan, lihat saja di dalamnya.

Jiří Kozlovský
sumber
Ini baik-baik saja hari ini. Pada saat pertanyaan awalnya ditulis, tidak ada unit systemd yang disediakan untuk Solr.
Michael Hampton
1

Diuji pada Debian: Tambahkan '_SYSTEMCTL_SKIP_REDIRECT = OHYES' di awal skrip.

Fanboy Systemd mungkin tidak menyukainya tapi hei, saya tidak suka systemd, jadi ada :).

Guy Egozy
sumber
atau SYSTEMCTL_SKIP_REDIRECT=truedalam redhat
Otheus
tidak bekerja untuk saya :(
eadmaster
Pastikan Anda menambahkan _(garis bawah) sebelum SYSTEMCTL, seperti ini: _SYSTEMCTL_SKIP_REDIRECT=1. Jika Anda mencobanya dari commandline Anda juga perlu mengekspor var itu.
timurb
1

Saya memiliki kesalahan yang sama ketika mencoba untuk menggunakan skrip init LSB pada CentOS 7. Root menyebabkan ternyata skrip tersebut adalah tautan simbolis. Setelah diganti dengan salinan aslinya, semuanya bekerja dengan baik.

Gatopeich
sumber
Itu bisa menjadi kasus untuk skrip saya juga.
mlissner