อะไรคือสิ่งทดแทนที่ถูกต้องสำหรับ rc.local ใน systemd แทนที่จะสร้าง rc.local ขึ้นมาใหม่


25

ฉันไม่สามารถหาวิธีที่ถูกต้องในการดำเนินการบางท้องถิ่นสคริปต์ (หรือคำสั่งในท้องถิ่นมาก) ที่ systemd ผมรู้อยู่แล้วว่าผมจะต้องไม่สร้างบริการ (ใน systemd หน่วย) สำหรับทุกชนิดของสคริปต์นี้ (หรือฉันต้อง?) ....

วิธีแก้ปัญหาที่ฉันพบคือการสร้าง rc.local และให้สิทธิ์การดำเนินการ

printf '#!/bin/bash \n\nexit 0' >/etc/rc.local 
chmod +x /etc/rc.local

ตัวอย่างเช่นถ้าฉันได้รับเซิร์ฟเวอร์ดั้งเดิมที่มี rc.local ง่าย ๆ ที่กำหนดค่าโดยคุณฉันจะรู้ว่าคุณทำอะไรและต้องเจ็บมากแค่ไหนในการอัปเกรดหรือติดตั้งสิ่งใหม่บน distro เนื่องจาก rc.local เป็นที่เคารพจากภายนอก แพ็คเกจ แต่ในทางกลับกันถ้าฉันติดตั้งเซิร์ฟเวอร์และสร้าง systemd unit หรือสองหรือสาม (หรือแม้กระทั่งบริการ sysvinit) เพียงแค่ทำภารกิจง่ายๆบางครั้งสิ่งนี้อาจทำให้ชีวิตของคุณยากขึ้นและมากกว่านี้ วันหนึ่งชื่ออาจขัดแย้งกับชื่อของบริการใหม่ที่สร้างโดยการพัฒนาการแจกจ่ายและอาจติดตั้งในการอัปเกรดทำให้เกิดปัญหากับสคริปต์ของฉัน!

ฉันเห็นคำถามอื่นที่ถามว่า rc.local อยู่ที่ไหนและคำตอบคือการสร้างและให้สิทธิ์การดำเนินการฉันคิดว่าคำถามของฉันไม่เหมือนกันจริง ๆเพราะฉันไม่อยากรู้ว่าอยู่ที่ไหน - เชื่อฉันฉันแค่ต้องการ ที่จะยอมรับว่ามันเลิกแต่ฉันไม่สามารถหาวิธีที่ถูกต้องสำหรับการทำชนิดของสิ่งนี้ควรผมสร้างหน่วยเพียงบางอย่างง่ายเช่นนั้น?


4
systemd "การย้ายที่ชนะเท่านั้นไม่ได้เล่น"; หรือขึ้นอยู่กับสิ่งที่คุณต้องการคุณอาจสร้างหน่วย systemd ฉันอาจจะใช้ rc.local ในตอนนี้และใส่ใจเมื่อมันหายไป
Rui F Ribeiro

ดังนั้นคุณคิดว่าวิธีที่เป็นทางการคือการสร้างหน่วยเช่นบริการหรือไม่? กรุณาโพสต์เป็นคำตอบวิธีการทำ
Luciano Andress Martini

1
เมื่อฉันลอง Ubuntu ฉันได้สร้างหน่วยสำหรับการแคชเอสเอสเอสแบบถาวรในเดสก์ท็อปของฉันในขณะที่ฉันไม่ได้รีบูทและอีกอันเป็นอย่างอื่นที่ฉันจำไม่ได้ คุณยังสามารถสร้างหนึ่งชี้ไปที่ / etc / rc.local แต่ดูเหมือนว่าระบบกำลังทำมันด้วยตัวคุณเองตอนนี้ .... ฉันจะ rc.local ในขณะนี้และถ้าถูกยกเลิกให้สร้างหนึ่งชี้ไปที่ปลอม / etc / rc.local แล้ว
Rui F Ribeiro

สิ่งนี้มีแนวโน้มที่จะทำลายเอกสารราวกับว่าหนังสือบางเล่มบอกว่าคุณต้องใส่อะไรลงใน /etc/rc.local และคุณพยายามอัพเกรดเอกสารนี้โดยบอกว่าตัวอย่างนั้น rc.local จะต้องถูกทำเครื่องหมายว่าปฏิบัติการได้เมื่อมันถูกคัดค้านโดยสิ้นเชิง เอกสารนั้นใช้งานไม่ได้ แต่ถ้าคุณบอกว่าคุณต้องสร้างหน่วยให้ชี้ไปที่ /etc/rc.local เอกสารฉบับนี้จะส่งผลกระทบเนื่องจาก systemd ขัดแย้งกับหน่วยของคุณ ฉันเชื่อว่าถ้าคุณพูดถูกพวกเขาอาจไม่ได้ตัดสินใจว่ามันเลิกใช้หรือไม่เพราะพวกเขายังไม่มีตัวแทน ... เมื่อพวกเขาตัดสินใจว่าเอกสารทั้งหมดจะถูกทำลายอีกครั้ง
Luciano Andress Martini

สคริปต์ประเภทใดที่คุณจำเป็นต้องเรียกใช้งาน Systemd มีประเภทหน่วยจำนวนมาก "บริการ" เป็นเพียงประเภทเดียวเท่านั้น เช่นหน่วยเมานต์หน่วยเมานท์หน่วยจับเวลาหน่วยเป้าหมาย หนึ่งในนั้นสามารถแก้ปัญหาของคุณได้ไหม
andcoz

คำตอบ:


17

เป็นแหลมออกที่อื่น ๆ มันจะกลายเป็นมลทินในระดับปานกลางจะใช้ภายใต้rc-local.servicesystemd

  1. เป็นไปได้ในทางทฤษฎีว่าการกระจายของคุณจะไม่เปิดใช้งาน (ฉันคิดว่านี่ไม่ใช่เรื่องปกติเช่นเนื่องจากการปิดใช้งานตัวเลือกบิลด์เดียวกันจะลบpoweroff/ rebootคำสั่งที่ผู้ใช้จำนวนมากใช้)
  2. ความหมายยังไม่ชัดเจน Systemd กำหนดrc-local.serviceวิธีหนึ่ง แต่ Debian มีไฟล์แบบดรอปอินซึ่งจะเปลี่ยนแปลงการตั้งค่าที่สำคัญอย่างน้อยหนึ่งรายการ

rc-local.serviceมักจะทำงานได้ดี หากคุณกังวลเกี่ยวกับข้างต้นสิ่งที่คุณต้องทำคือทำสำเนาของคุณเอง! นี่คือความมหัศจรรย์:

# /etc/systemd/system/my-startup.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/libexec/my-startup-script

[Install]
WantedBy=multi-user.target

ฉันไม่คิดว่าคุณต้องเข้าใจทุกรายละเอียด [*] แต่มีสองสิ่งที่คุณต้องรู้ที่นี่

  1. systemctl enable my-startup.serviceแต่คุณต้องเปิดการใช้งานนี้กับ

  2. หากสคริปต์ของคุณขึ้นอยู่กับบริการอื่นใดรวมถึงnetwork-online.targetคุณต้องประกาศด้วย เช่นเพิ่ม[Unit]ส่วนที่มีเส้นและWants=network-online.targetAfter=network-online.target

    คุณไม่ต้องกังวลเกี่ยวกับการพึ่งพาบริการ "เริ่มต้นระบบ" - โดยเฉพาะบริการที่สั่งไว้แล้วก่อนหน้าbasic.targetนี้ บริการเช่นmy-startup.serviceมีการสั่งซื้อโดยอัตโนมัติหลังจากจนกว่าพวกเขาจะตั้งbasic.targetDefaultDependencies=no

    หากคุณไม่แน่ใจว่าหนึ่ง dependencies ของคุณเป็นบริการ "บูตต้น" วิธีการหนึ่งคือการแสดงรายการบริการที่มีการสั่งซื้อก่อนbasic.target, systemctl list-dependencies --after basic.targetโดยการทำงาน (โปรดทราบว่า--afterไม่ใช่--before)

มีการพิจารณาบางอย่างที่ฉันคิดว่านำไปใช้กับ pre-systemd rc.local:

  1. คุณต้องตรวจสอบให้แน่ใจว่าคำสั่งของคุณไม่ขัดแย้งกับโปรแกรมอื่นที่พยายามควบคุมสิ่งเดียวกัน
  2. ที่ดีที่สุดคือไม่เริ่มต้นยาวทำงานโปรแกรม aka rc.localภูตจาก

[*] ฉันใช้Type=oneshot+ RemainAfterExit=yesเพราะมันสมเหตุสมผลกว่าสำหรับสคริปต์แบบ one-shot ส่วนใหญ่ มันทำให้เป็นทางการว่าคุณจะเรียกใช้ชุดคำสั่งซึ่งmy-startupจะแสดงเป็น "แอคทีฟ" เมื่อพวกเขาเสร็จสิ้นและคุณจะไม่เริ่มดีมอน


มีสถานที่ "ท้องถิ่น" สำหรับการสร้างบริการหรือตัวอย่างหรืออะไรก็ตาม - หรือฉันสามารถเชื่อว่านี่เป็นท้องถิ่นและไม่ควรเปลี่ยนแปลง? ถ้าฉันพัฒนา daemons ของตัวเอง? เพราะฉันไม่ต้องการที่จะเปลี่ยนแปลงความเป็นต้นฉบับของระบบดังนั้นเมื่อฉันติดตั้ง apt-get ฉันไม่ต้องการเห็นระบบของฉันติดไฟเพราะสคริปต์ที่ถูกแทนที่หรือสิ่งนี้เป็นตัวอย่าง ฉันแค่อยากจะเชื่อว่าภูตจะเริ่มต้นเพียงครั้งเดียวโดยไม่ต้องทำสิ่งบ้า ๆ เพิ่มเติมใด ๆ ที่ฉันกลัว ... เช่นพยายามที่จะรีสตาร์ทมันเป็นอนันต์ถ้ามันพัง ฯลฯ ...
Luciano Andress Martini

1
@LucianoAndressMartini ถ้าคุณถามว่าวิธีที่ถูกต้องในการเริ่มต้น daemon คืออะไรคุณควรกำหนดบริการส่วนบุคคลสำหรับมัน นั่นอาจเป็น.serviceหน่วยระบบดั้งเดิมหรือหากคุณต้องการเขียนสคริปต์เริ่มต้น LSB คุณสามารถทำได้แทน ฉันไม่ต้องการแนะนำให้ใส่ daemons หลายตัวrc-local.serviceหรือเทียบเท่าฉันคิดว่ามันอาจใช้งานได้ แต่มันก็ดูดีกว่านี้ถ้าคุณสามารถรีสตาร์ท daemon แต่ละตัวได้systemctl restart my-daemonเหมือนอย่างอื่น /etc/systemd/systemก็ตั้งใจว่าคุณใส่บริการในท้องถิ่นของคุณ
sourcejedi

1
@LucianoAndressMartini คุณต้องหลีกเลี่ยงการใช้ชื่อเดียวกันกับบริการอื่น ๆ - เช่นเดียวกับใน sysvinit ในสถานการณ์ที่คล้ายกันบางครั้งฉันก็เริ่มชื่อด้วยlocal-...
sourcejedi

1
ขอขอบคุณ!!! บันทึกหลังจากครึ่งวัน รายละเอียดเหล่านี้มีความสำคัญสำหรับฉัน: Type = oneshot, RemainAfterExit = ใช่, ต้องการ = network-online.target, After = network-online.target เพียงแค่ปรับใช้งาน apache และตั้งค่า IP แบบคงที่เป็น 192.168.1.80 ดังนั้นเราเตอร์สามารถกำหนดปริมาณการใช้งานได้ ควรเป็นเรื่องเล็กน้อย มันน่ารำคาญใน Debian9 แทบจะไม่ได้รับคำแนะนำออนไลน์ใด ๆ ยกเว้น "apt-get apache", "systemctl start apache" หรือคำสั่งที่มี init.d แต่ไม่มีคำแนะนำใด ๆ สำหรับ Apache ที่สร้างโดยซอร์สภายใต้ Debian9
MichaelsonBritt

1
@MichaelsonBritt เป็นการดีที่สุดที่จะไม่เริ่มโปรแกรมระยะยาวหรือที่รู้จักว่า daemons จาก rc.local ฉันใช้Type=oneshot... มันทำให้เป็นทางการว่า ... คุณจะไม่เริ่มดีมอน หากคุณต้องการข้อมูลเกี่ยวกับการเริ่มต้นภูตโปรดถามคำถามใหม่
sourcejedi

15

ลืมrc.localไปเลย

ที่ฉันพูดเกี่ยวกับ CentOS 7และเกี่ยวกับ Debian 8และเกี่ยวกับ Ubuntu 15 :

คุณกำลังใช้ระบบปฏิบัติการ systemd + Linux /etc/rc.localเป็นกลไกการทำงานร่วมกันสองครั้งใน systemd เนื่องจากเป็นกลไกการทำงานร่วมกันแบบย้อนหลังสำหรับกลไกที่เป็นกลไกความเข้ากันได้ใน van Smoorenburg System 5 rcclone

การใช้งาน/etc/rc.localผิดไปอย่างน่ากลัว ผู้คนต่างประหลาดใจกับความจริงที่ว่า systemd ไม่ได้ทำงานrc.localในลักษณะเดียวกันในสถานที่เดียวกันใน bootstrap ตามที่คุ้นเคย (หรือไม่สมควรคาดหวัง: มันไม่ได้ในความเป็นจริงทำงานที่ผ่านมา . ในระบบเก่าเป็นคู่มือ OpenBSD ยังชี้ให้เห็น) อื่น ๆ ได้รับประหลาดใจโดยความจริงที่ว่าสิ่งที่พวกเขาตั้งขึ้นในrc.localการคาดหวังว่าวิธีการเดิมของการทำสิ่งที่เป็น แล้วยกเลิกได้อย่างสมบูรณ์โดยชอบของใหม่udevกฎ NetworkManager, systemd-logind, systemd-resolvedหรือต่างๆ "Kit" s

อย่างสุดขั้ว " ทำไม` init 0` ส่งผลให้ 'อาร์กิวเมนต์ส่วนเกิน' ใน Arch ติดตั้ง? " บางระบบปฏิบัติการแล้วให้ systemd โดยไม่ต้องเข้ากันได้ย้อนหลังให้บริการเช่นsystemd-rc-local-generatorเครื่องกำเนิดไฟฟ้า ขณะที่เดเบียนยังคงรักษาคุณลักษณะร่วมกันหลัง , Arch Linux สร้าง systemd กับพวกเขาปิด ดังนั้นใน Arch และระบบปฏิบัติการเช่นนั้นคาดว่าจะได้รับการละเว้นทั้งหมด/etc/rc.local

ลืมrc.localไปเลย มันไม่ใช่วิธีที่จะไป คุณมีระบบปฏิบัติการ systemd + Linux ดังนั้นสร้าง systemd service unit ที่เหมาะสมและอย่าเริ่มต้นจากจุดที่มีความเข้ากันได้ย้อนหลังสองระดับ (บน Ubuntu และ Fedora มันถูกลบออกสามครั้งrcโคลนVan Smoorenburg System 5 ที่ตามมาrc.localหลังจากนั้นถูกแทนที่ตัวเองสองครั้งในช่วงทศวรรษที่ผ่านมาโดยเริ่มจากการพุ่งพรวดแล้วตามด้วย systemd)

ยังจำกฎข้อแรกสำหรับการโยกย้ายไปยัง systemd

นี่ไม่ใช่ความคิดใหม่ที่เฉพาะเจาะจงกับ systemd บนรถตู้ Smoorenburg rcและพุ่งพรวดระบบสิ่งที่ต้องทำคือการทำให้รถตู้ที่เหมาะสม Smoorenburg สคริปต์หรือแฟ้มงานพุ่งพรวดมากกว่าการใช้งานrc rc.localแม้บันทึกคู่มือของ FreeBSD ว่าในปัจจุบันหนึ่งสร้าง Mewburn เหมาะสมสคริปต์แทนการใช้rc /etc/rc.localMewburn rcเปิดตัวโดย NetBSD 1.5 ในปี 2000

/etc/rc.localวันที่จากเวลาของรุ่นที่เจ็ด Unix และก่อน มันถูกแทนที่โดย/etc/inittabและระดับการทำงานที่ใช้rcใน AT & T ระบบยูนิกซ์ 3 (ที่มีแตกต่างกันเล็กน้อย/etc/inittabใน AT & T ระบบยูนิกซ์ 5) ในปี 1983 แม้ว่าตอนนี้ก็คือประวัติศาสตร์

สร้างคำนิยามบริการพื้นเมืองที่เหมาะสมสำหรับระบบการจัดการบริการของคุณไม่ว่าจะเป็นกำบริการสำหรับ Nosh ชุดเครื่องมือของservice-managerและsystem-controlเป็น/etc/rc.d/สคริปต์สำหรับ Mewburn rcแฟ้มหน่วยบริการ systemd ไฟล์งานพุ่งพรวดไดเรกทอรีบริการ runit / S6 / daemontools -encore หรือแม้กระทั่ง/etc/init.d/สคริปต์สำหรับรถตู้ rcSmoorenburg

ใน systemd ไฟล์หน่วยบริการที่เพิ่มโดยผู้ดูแลระบบ/etc/systemd/system/มักจะเข้า (หรือ/usr/local/lib/systemd/system/ไม่ค่อย) ด้วยผู้จัดการบริการ nosh /var/local/sv/เป็นสถานที่ทั่วไปสำหรับกลุ่มบริการในพื้นที่ Mewburn เกี่ยวกับการใช้ rc FreeBSD ไฟล์หน่วยบริการที่จัดทำแพคเกจและบันเดิลบริการหากคุณกำลังสร้างมันให้ไปยังสถานที่ต่างกัน/usr/local/etc/rc.d/

อ่านเพิ่มเติม


2
@LucianoAndressMartini คำถามที่ดีกว่าน่าจะเป็นวิธีจัดการข้อมูลโค้ดเฉพาะของ rc.local ในบริการ systemd ดังนั้นหากคุณมีข้อมูลโค้ดที่เฉพาะเจาะจง (คุณพูดถึงคำแนะนำจากเอกสารประกอบของซอฟต์แวร์บางตัว) อาจจะโพสต์คำถามเกี่ยวกับคำถามนั้นแทน มีกฎทั่วไปบางอย่างที่สามารถใช้สำหรับการแปลง แต่คุณจะได้รับประโยชน์มากขึ้นจากการใช้ประโยชน์จากคุณสมบัติของซอฟต์แวร์ที่คุณใช้งานอยู่ (เช่นการทำงานในเบื้องหน้าไม่พยายาม daemonize ฯลฯ ) ดังนั้นให้ถามเกี่ยวกับกรณีเฉพาะ อาจเป็นประโยชน์
filbranden

4
คุณต้องสงสัยว่ามันรอดชีวิตจากการคัดค้านมาตั้งแต่ปี 2526 บางทีอาจมีบางอย่างเกิดขึ้นหรือไม่?
แดนคาร์เตอร์

4
คำตอบนี้เป็นการเทศนาและล้มเหลวที่จะตอบคำถามง่าย ๆ ว่า "ฉันควรทำอะไรเล็กน้อย" มันอาจมีข้อมูลและให้การอ้างอิงจำนวนมาก แต่เอาชนะวัตถุประสงค์ของ stackexchange
gps

ฉันนำสิ่งนี้ (จุดสิ้นสุดของ rc.local) ขึ้นมาพร้อมกับการแก้ไขปัญหา dns เนื่องจากเหตุผลที่ linux ไม่ได้พัฒนา แต่จริงๆแล้วจะกลายเป็นสปาเก็ตตี้โค้ดมากขึ้นเรื่อย ๆ systemd กลายเป็นกล่องดำสำหรับคนจำนวนมาก หากผู้ใช้หรือผู้ดูแลระบบต้องการใส่บางสิ่งบางอย่างใน rc.local และไม่สามารถทำได้อีกต่อไปมันไม่มีประโยชน์ที่จะบังคับให้พวกเขาทำหลักสูตร systemd หรือสิ่งอื่น ๆ ที่คุณเทศนาเพื่อให้ได้ผลลัพธ์ที่เหมือนกันในไม่กี่วันแทนที่จะเป็นนาที แน่นอนว่าคนโง่สามารถทำสิ่งที่โง่ ๆ กับทุกอย่างที่ใช้งานได้ดีและใช้งานได้ง่ายนั่นไม่ใช่เหตุผลที่จะจบเรื่องได้
Julius

2

สรุปhttps://www.linuxbabe.com/linux-server/how-to-enable-etcrc-local-with-systemd

สร้าง /etc/systemd/system/rc-local.service:

# /etc/systemd/system/rc-local.service
[Unit]
 Description=/etc/rc.local Compatibility
 ConditionPathExists=/etc/rc.local

[Service]
 Type=forking
 ExecStart=/etc/rc.local start
 TimeoutSec=0
 StandardOutput=tty
 RemainAfterExit=yes
 SysVStartPriority=99

[Install]
 WantedBy=multi-user.target

แล้ว:

sudo touch /etc/rc.local
sudo chmod +x /etc/rc.local
sudo systemctl enable rc-local

ตรวจสอบกับ:

sudo systemctl start rc-local.service
sudo systemctl status rc-local.service

การใช้งานที่ systemd จัดเตรียมไว้StandardOutput=journal+console(คอนโซลเทียบเท่ากับ tty ในตัวอย่างของคุณ) ซึ่งดูเหมือนว่าจะมีประโยชน์มากกว่าสำหรับการแก้ไขปัญหา การสนับสนุนสำหรับSysVStartPriority=ถูกลบออกไปในบางจุด บางทีคุณสามารถแสดงความคิดเห็นว่ามีความสำคัญSysVStartPriority=หรือลบออก นอกจากนั้นมันเป็นคำตอบที่ดี
sourcejedi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.