सिस्टमैड में मेरे पुराने इनइट स्क्रिप्ट काम करने का सबसे आसान तरीका क्या है?


48

मैं एक नई systemd स्क्रिप्ट बनाकर सही काम नहीं करना चाहता, मैं बस यह चाहता हूं कि मेरी पुरानी init स्क्रिप्ट अब फिर से काम करे कि मैंने अपने सिस्टम को एक OS में अपग्रेड किया है जो systemd का उपयोग कर रहा है।

मैंने संक्षेप में शोध किया है कि init लिपियों को कैसे रूपांतरित किया जाए और 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 के लिए असंगतियां पेज का कहना है कि:

एलएसबी हेडर निर्भरता जानकारी मायने रखती है। कई वितरणों पर SysV कार्यान्वयन LSB init स्क्रिप्ट हेडर में एन्कोड की गई निर्भरता जानकारी का उपयोग नहीं करते थे, या केवल बहुत ही सीमित तरीके से उनका उपयोग करते थे। उसके कारण वे अक्सर गलत या अधूरे होते हैं। 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

"मैं सही काम नहीं करना चाहता" आपको बहुत सारी नकारात्मक प्रतिक्रिया मिल रही है। आशा है कि आपने अपना हेटमैट सूट दान कर दिया है। वैसे भी, कम से कम प्रतिरोध का रास्ता कुछ भी नहीं है ; बस अपने init स्क्रिप्ट का उपयोग करें।
माइकल हैम्पटन

6
एक दिन, निश्चित रूप से, मैं सही काम करूंगा। लेकिन हम सीमित संसाधनों की दुनिया में रहते हैं। मैंने जो काम नहीं किया है उसके बारे में अधिक विवरण जोड़ा है, क्योंकि जाहिर है कि यह पहले से ही काम करने वाला है।
mlissner

क्या आप उबंटू पर ऐसा करने की कोशिश कर रहे हैं? भगवान आपकी मदद करें, क्यों?
माइकल हैम्पटन

1
मैं हूँ। क्या वह कहीं और से भी बदतर है?
mlissner

1
उबंटू की अन्य विफलताओं में से एक, प्रासंगिक यहां यह है कि उपस्टार्ट एक ईश्वरीय दुःस्वप्न था। यह अच्छा है कि वे अंततः इससे छुटकारा पा रहे हैं, लेकिन जैसा कि वास्तव में इसके साथ संगत नहीं है , आपकी इन्विट स्क्रिप्ट । इससे पहले कि यह कैसे काम किया (प्राचीन) SysV संगतता के माध्यम से सबसे अधिक संभावना है, और जब सिस्टमड इसे संभाल सकता है, तो उबंटू ने स्पष्ट रूप से इसे तोड़ने के लिए कुछ किया है। मैं इस काम को करने की कोशिश नहीं करूंगा, खासकर जब से आपको सिस्टमड यूनिट फाइल लिखने में कम समय लगा होगा, जबकि आपने पहले ही इस पर खर्च किया होगा।
माइकल हैम्पटन

जवाबों:


34

गंभीरता से, इस तरह की सेवा के लिए लिखने के लिए एक systemd इकाई फ़ाइल तुच्छ है ... या अधिकांश सेवाओं के लिए।

यह आपको वहां के लगभग 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

मेरे लिए हेडर में सिर्फ इनिट इंफो ब्लॉक जोड़ना आसान था जैसा कि यहाँ सुझाया गया है :

#!/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
उफ़, आप सही कह रहे हैं, शायद इसे कॉपी-पेस्ट प्रक्रिया में हटा दिया गया था! (अभी तय)
eadmaster

7

सिस्टम के साथ सोल लिगेसी इनिट स्क्रिप्ट का उपयोग करने के लिए एक और समाधान:

systemctl daemon-reload  
systemctl enable solr  
systemctl start solr  

1
उन्होंने पहले ही कोशिश की, और यह काम नहीं किया, क्योंकि उबंटू छोटी गाड़ी है।
माइकल हैम्पटन

4

प्रदान की गई स्क्रिप्ट का उपयोग करके सोल को चलाना अधिक सुविधाजनक है ।

Systemd इकाई फ़ाइल इस तरह दिखती है:

[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पर्यावरण चर का सम्मान करती है, बस इसमें एक नज़र डालें।


यह आज ठीक है। जिस समय यह प्रश्न मूल रूप से लिखा गया था, उस समय सोलर के लिए प्रदान की गई सिस्टम यूनिट नहीं थी।
माइकल हैम्पटन

1

डेबियन पर परीक्षण किया गया: स्क्रिप्ट की शुरुआत में '_SYSTEMCTL_SKIP_REDIRECT = OHYES' जोड़ें।

Systemd के प्रशंसक इसे पसंद नहीं कर सकते लेकिन हे, मुझे सिस्टमड पसंद नहीं है, इसलिए :)।


या SYSTEMCTL_SKIP_REDIRECT=true
रेडहैट

मेरे लिए काम नहीं किया :(
eadmaster

सुनिश्चित करें कि आप _इससे पहले (अंडरस्कोर) जोड़ दें SYSTEMCTL, जैसे _SYSTEMCTL_SKIP_REDIRECT=1:। यदि आप कोशिश करते हैं कि कमांडलाइन से आपको उस संस्करण को निर्यात करने की भी आवश्यकता है।
टिम

1

CentOS 7. पर LSB init स्क्रिप्ट का उपयोग करने की कोशिश करते समय मुझे वही त्रुटि थी। मूल कारण यह निकला कि स्क्रिप्ट एक प्रतीकात्मक लिंक था। एक बार मूल की एक प्रति के साथ बदल दिया, सब कुछ ठीक काम किया।


मेरी स्क्रिप्ट के लिए भी यही हो सकता था।
mlissner
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.