Eski init betiğimi systemd'de çalıştırmanın en kolay yolu nedir?


48

Yeni bir systemd betiği oluşturarak doğru olanı yapmak istemiyorum, sadece sistemimi systemd kullanan bir işletim sistemine yükselttiğim için eski init betiğimin tekrar çalışmasını istiyorum.

İnit komut dosyalarının nasıl dönüştürüleceğini ve sistem komut dosyalarının nasıl yazılacağını kısaca araştırdım, ancak düzgün bir şekilde öğrendiğinizden ve doğru şekilde yaptığımdan birkaç saat alacağımdan eminim.

Mevcut durum:

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

Ve:

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

Şu anda, sadece işe geri dönmek istiyorum. Bunun tekrar çalışmaya başlamasında en az direnç gösteren yol nedir ?

Güncellemeler

Bunları çözmek istemedim - gerçekten yapmadım - ama zorundayım ve ilk ipucumu ortaya çıkardım:

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 için uyumsuzluklar sayfa söylüyor:

LSB başlık bağımlılığı bilgisi önemlidir. Birçok dağıtımdaki SysV uygulamaları, LSB init betiği başlıklarında kodlanan bağımlılık bilgisini kullanmadı veya bunları yalnızca çok sınırlı şekillerde kullandı. Bundan dolayı genellikle yanlış veya eksik olurlar. ancak systemd bu başlıkları tamamen yorumlar ve çalışma zamanında yakından izler

Bence bu, senaryomun düzeltilinceye kadar çalışmayacağı anlamına geliyor.

Söz konusu komut dosyası:

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

“Doğru şeyi yapmak istemiyorum” size çok fazla olumsuz geri bildirim verecek. Umarım tehlikeli kıyafeti giymişsindir. Neyse, en az direnç gösteren yol hiçbir şey değildir ; sadece init betiğini kullanın.
Michael Hampton

6
Bir gün, kesinlikle, doğru olanı yapacağım. Ancak, sınırlı kaynaklar dünyasında yaşıyoruz. İşe yaramayan şey hakkında daha fazla ayrıntı ekledim, çünkü görünüşe göre bu zaten işe yaramıştı.
mlissner

Bunu Ubuntu'da yapmaya mı çalışıyorsun? Tanrı yardımcınız olsun, neden?
Michael Hampton

1
Ben. Bu herhangi bir yerden daha kötü mü?
mlissner

1
Ubuntu'nun diğer başarısızlıklarının tümü arasında, buradaki ilgisi, Upstart’ın çok iyi bir kabus olduğu. Onlar nihayet kurtuluyoruz bu iyi, ama init komut olarak onunla gerçekten uyumlu değildir. Daha önce nasıl çalıştığı (eski) SysV uyumluluğu ile olasıdır ve sistemd bu sorunu çözebilirken, Ubuntu görünüşte kırmak için bir şey yapmıştır. Bu işi yapmaya çalışmayı önermiyorum, özellikle de sistemd birim dosyasını yazmak için harcadığınızdan çok daha az zaman harcayacağınızdan.
Michael Hampton,

Yanıtlar:


34

Cidden, bir systemd birim dosyası böyle bir hizmet için ya da çoğu hizmet için yazmak için çok önemlidir.

Bu, oradaki yolun% 95'ini size ulaştırmalı. Bunu, örneğin/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

Şeyler Not değildir günlük dosyası ve böyle olduğu gibi, burada; systemd, servis çıkışını servisin adı altında otomatik olarak yakalar ve kaydeder.


5
Peki, bu tweaked ve yapılandırılmış ve her şeyi almak için tüm gün az ya da çok sürdü. systemdBazı tuhaflıklar vardır, bu komut dosyası gibi siz açmazsanız kalıcı günlükleri olmaz. Sonunda, yine de çalışıyor ve itmek ihtiyacım olan şeydi, teşekkürler.
mlissner

15

Benim için, başlıktaki init bilgi bloğunu burada önerildiği şekilde eklemek daha kolaydı :

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

Ardından yürütün sudo systemctl enable solr.


1
Kodunuzda benim yaptığım gibi olan ve senaryonun çalışmasını engelleyen (böylece "contains no runlevels, aborting"yanlış bir hatayı alıyorum) fark edene kadar bir yazım hatası var : ikinci satırınızda eksik olan üçüncü # (olması gerektiği ### BEGIN INIT INFO). Bahse girerim, bu da neden bu kadar az oy aldığını açıklar.
Pere

1
ayy, haklısın, muhtemelen kopyala yapıştır işleminde kaldırıldı! (şimdi düzeltildi)
eadmaster

7

Solr legacy init betiğini systemd ile kullanmak için başka bir çözüm:

systemctl daemon-reload  
systemctl enable solr  
systemctl start solr  

1
Bunu zaten denedi ve işe yaramadı, çünkü Ubuntu buggy.
Michael Hampton

4

Sağlanan start komut dosyasını kullanarak Solr'u çalıştırmak daha uygundur .

Systemd birim dosyası şöyle görünür:

[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

Ayrıca ekleyerek ortam değişkenleri yararlanabilir unutmayın EnvironmentFileiçin [Service]bölüm. Betik bin/solr, ortam değişkenlerine saygı duyuyor, sadece bir göz atın.


Bugün bu iyi. Asıl soru yazıldığı sırada Solr için sağlanan bir sistem birimi yoktu.
Michael Hampton

1

Debian'da test edildi: Betik başlangıcında '_SYSTEMCTL_SKIP_REDIRECT = OHYES' ekleyin.

Systemd fanboyları bundan hoşlanmayabilir ama hey, systemd'den hoşlanmıyorum, o yüzden orada :).


veya SYSTEMCTL_SKIP_REDIRECT=trueredhat
Otheus

benim için işe yaramadı :(
eadmaster

Eklemek emin olun _önce (alt çizgi) SYSTEMCTL, bunun gibi: _SYSTEMCTL_SKIP_REDIRECT=1. Bunu komut satırından denerseniz, bu değişkeni de dışa aktarmanız gerekir.
Timurb

1

CentOS 7'de bir LSB init betiği kullanmaya çalışırken de aynı hatayı aldım. Kök neden, betiğin sembolik bir bağ olduğu ortaya çıktı. Bir zamanlar orijinal belgenin bir kopyasıyla değiştirildi, her şey yolunda gitti.


Senaryom için de geçerli olabilirdi.
mlissner,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.