วิธีที่ง่ายที่สุดในการทำให้สคริปต์ init เก่าของฉันทำงานใน systemd คืออะไร


48

ฉันไม่ต้องการทำสิ่งที่ถูกต้องด้วยการสร้างสคริปต์ systemd ใหม่ฉันแค่อยากให้สคริปต์ init เก่าทำงานอีกครั้งตอนนี้ฉันได้อัพเกรดระบบของฉันเป็นระบบปฏิบัติการที่ใช้ systemd

ฉันได้ทำการค้นคว้าสั้น ๆ ถึงวิธีการแปลงสคริปต์เริ่มต้นและวิธีการเขียนสคริปต์ 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กล่าวว่า:

ข้อมูลการพึ่งพาส่วนหัวของ 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

"ฉันไม่ต้องการทำสิ่งที่ถูกต้อง" จะทำให้คุณได้รับความคิดเห็นเชิงลบมากมาย หวังว่าคุณจะสวมชุดป้องกันอันตรายของคุณ อย่างไรก็ตามเส้นทางของความต้านทานน้อยคืออะไร ; เพียงใช้สคริปต์เริ่มต้นของคุณ
Michael Hampton

6
อยู่มาวันหนึ่งฉันจะทำในสิ่งที่ถูกต้อง แต่เราอยู่ในโลกที่มีทรัพยากร จำกัด ฉันได้เพิ่มรายละเอียดเพิ่มเติมเกี่ยวกับสิ่งที่ไม่ทำงานเนื่องจากเห็นได้ชัดว่าควรทำงานแล้ว
mlissner

คุณพยายามทำสิ่งนี้บน Ubuntu หรือไม่? พระเจ้าช่วยคุณทำไม
Michael Hampton

1
ฉัน. มันแย่กว่าที่อื่นหรือเปล่า?
mlissner

1
ในบรรดาความล้มเหลวอื่น ๆ ทั้งหมดของ Ubuntu สิ่งที่เกี่ยวข้องที่นี่คือการพุ่งพรวดเป็นฝันร้ายที่โหดร้าย เป็นเรื่องดีที่ในที่สุดพวกเขาก็กำจัดมันออกไป แต่สคริปต์เริ่มต้นของคุณซึ่งไม่สามารถใช้งานได้จริง วิธีการทำงานก่อนหน้านี้มีแนวโน้มมากที่สุดผ่านความเข้ากันได้กับ SysV (เก่า) และในขณะที่ systemd สามารถจัดการกับสิ่งนี้ได้ Ubuntu ได้ทำบางสิ่งบางอย่างเพื่อทำลายมัน ฉันจะไม่แนะนำให้พยายามทำงานนี้โดยเฉพาะอย่างยิ่งเนื่องจากจะใช้เวลาน้อยกว่าคุณในการเขียนไฟล์ systemd unit มากกว่าที่คุณได้ใช้ไปแล้ว
Michael Hampton

คำตอบ:


34

อย่างจริงจังไฟล์ systemd unit นั้นสำคัญที่จะเขียนสำหรับบริการเช่นนี้ ... หรือสำหรับบริการส่วนใหญ่

นี่ควรจะทำให้คุณได้ประมาณ 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) ฉันพนันได้เลยว่าจะอธิบายได้ว่าทำไมคุณถึงได้คะแนนเสียงน้อยเช่นกัน
Pere

1
อ๊ะคุณพูดถูกมันอาจถูกลบไปแล้วในกระบวนการคัดลอกวาง! (แก้ไขแล้ว)
eadmaster


4

การเรียกใช้ Solr สะดวกยิ่งขึ้นโดยใช้สคริปต์เริ่มต้นที่ให้มา

ไฟล์ systemd unit มีลักษณะดังนี้:

[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เคารพตัวแปรสภาพแวดล้อมเพียงแค่ดูใน


วันนี้เป็นวันที่ดี ในขณะที่คำถามถูกเขียนครั้งแรกไม่มีหน่วย systemd ที่จัดไว้ให้สำหรับ Solr
Michael Hampton

1

ทดสอบบนเดเบียน: เพิ่ม '_SYSTEMCTL_SKIP_REDIRECT = OHYES' ในตอนเริ่มต้นของสคริปต์

Systemd fanboys อาจไม่ชอบ แต่เดี๋ยวก่อนฉันไม่ชอบ systemd ดังนั้นจึงมี :)


หรือSYSTEMCTL_SKIP_REDIRECT=trueใน RedHat
Otheus

ไม่ได้ผลสำหรับฉัน :(
eadmaster

ตรวจสอบให้แน่ใจว่าคุณเพิ่ม_(ขีดเส้นใต้) ก่อนเช่นนี้SYSTEMCTL _SYSTEMCTL_SKIP_REDIRECT=1หากคุณลองใช้จาก commandline คุณจะต้องส่งออก var นั้นด้วย
timurb

1

ฉันมีข้อผิดพลาดเดียวกันในขณะที่พยายามใช้สคริปต์เริ่มต้นของ LSB บน CentOS 7 สาเหตุหลักปรากฏว่าสคริปต์นั้นเป็นลิงก์สัญลักษณ์ เมื่อแทนที่ด้วยสำเนาต้นฉบับทุกอย่างก็ใช้ได้ดี


นั่นอาจเป็นกรณีสำหรับสคริปต์ของฉันเช่นกัน
mlissner
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.