ทำไมคำสั่งใน /etc/rc.local ไม่ถูกเรียกใช้งานระหว่างการเริ่มต้น?


39

ฉันมีคำสั่งเดียวใน/etc/rc.localสคริปต์ของฉันที่ควรจะเริ่ม daemon การอัพเดทสำหรับTiny Tiny RSSในระหว่างการเริ่มต้น แต่สคริปต์ไม่ได้ถูกเรียกใช้ระหว่างการเริ่มต้น ทำไม?

ไฟล์ /etc/rc.local ทั้งหมด:

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

/sbin/start-stop-daemon -b -c www-data:www-data -S -x /usr/bin/php /var/www/ttrss/update_daemon2.php -- -quiet

exit 0

/etc/rc.local ปฏิบัติการได้:

# ls -l /etc/rc.local
-rwxr-xr-x 1 root root 342 May 25 16:14 /etc/rc.local

/etc/init.d/rc.local มีอยู่และปฏิบัติการได้:

# ls -l /etc/init.d/rc.local
-rwxr-xr-x 1 root root 801 Jul 27  2012 /etc/init.d/rc.local

/etc/init.d/rc.local ควรจะดำเนินการเมื่อเริ่มต้นสำหรับ runlevel นี้:

# runlevel 
N 2
# ls -l /etc/rc2.d/S99rc.local 
lrwxrwxrwx 1 root root 18 Sep 22  2012 /etc/rc2.d/S99rc.local -> ../init.d/rc.local

ถ้าฉันเรียก /etc/rc.local จากบรรทัดรับคำสั่งด้วยตนเอง update_daemon จะโหลด ...

# /etc/rc.local
# ps ax | grep update_daemon2.php
2233 ?        S      0:00 /usr/bin/php /media/sda5/www/news/update_daemon2.php -quiet
2234 ?        S      0:00 /usr/bin/php /media/sda5/www/news/update_daemon2.php -quiet

... ที่ฉันต้องจำให้ทำทุกครั้งที่เซิร์ฟเวอร์รีสตาร์ทจนกระทั่งปัญหานี้ได้รับการแก้ไข

มี คำถามที่ คล้ายกันอยู่แล้วแต่จนถึงตอนนี้ฉันไม่สามารถใช้ข้อมูลภายในกับปัญหาเฉพาะของฉันได้

ทำไมคำสั่งใน rc.local ไม่ถูกเรียกใช้งานระหว่างการเริ่มต้น?


อาจเป็นเพราะการrequirettyตั้งค่า เมื่อคุณเข้าสู่ระบบคุณกำลังรันสคริปต์ใน TTY แต่ในระหว่างการบูตระบบมันไม่ได้อยู่ใน TTY ลิงค์นี้อาจช่วยคุณshell-tips.com/2014/09/08/…ขอบคุณ
KICT

คำตอบ:


23

rc.localสคริปต์จะออกหากมีข้อผิดพลาดใด ๆ เกิดขึ้นขณะดำเนินการคำสั่งใด ๆ (พูดถึงการ-eตั้งค่าสถานะ#!/bin/sh -e)

เป็นไปได้ว่าสิ่งที่จำเป็นต้องมีบางอย่างไม่ตรงตามเมื่อคุณพยายามเรียกใช้คำสั่งเมื่อมีrc.localการดำเนินการดังนั้นการดำเนินการตามคำสั่งของคุณจึงล้มเหลว

ฉันพบสิ่งเดียวกันในขณะที่ตั้งค่า cpu ราชการด้วยตนเองและล้มเหลวในการทำเช่นrc.localนั้น นี่คือวิธีแก้ปัญหาแบบกำหนดเองของฉันซึ่งใช้update-rc.dในการทำให้คำสั่งของคุณทำงานเมื่อเริ่มต้น:

  1. สร้างไฟล์myscript.shในไดเรกทอรีที่/etc/init.dมีหัวเรื่อง:#!/bin/sh
  2. ใส่คำสั่งที่กำหนดเองของคุณเป็นเนื้อหา
  3. ทำให้ปฏิบัติการได้: sudo chmod +x /etc/init.d/myscript.sh
  4. สร้าง symlink สำหรับสคริปต์ของคุณสำหรับ runlevels ต่างๆ: sudo update-rc.d myscript.sh defaults

นอกจากนี้คุณสามารถตรวจสอบ/etc/network/if-up.dสคริปต์และดูว่าคุณสามารถทริกเกอร์คำสั่งของคุณเมื่อเริ่มระบบเครือข่ายหรือไม่


ขอบคุณสำหรับคำตอบ การตั้งค่าของฉันเปลี่ยนไปตั้งแต่ฉันโพสต์คำถามดังนั้นฉันจึงไม่สามารถทดสอบว่าคำตอบของคุณจะช่วยแก้ปัญหาได้หรือไม่
xx

โปรดบอกฉันทีละขั้นตอนที่ 4 ทำอะไรได้บ้าง ฉันใหม่เพื่อupdate-rc.d
Mohith7548

7

ฉันมีปัญหาที่คล้ายกันใน rc.local ไม่ทำงานเมื่อเริ่มต้น

sshades ให้ฉันด้วยคำตอบต่อไปนี้:

ตอนนี้อูบุนตูกำลังใช้ systemd และตอนนี้ rc.local ถูกพิจารณาว่าเป็นบริการที่ถูก "ปิด" โดยค่าเริ่มต้น คุณสามารถเปิด rc.local "on" โดยป้อนคำสั่งต่อไปนี้และทำการรีบูท:

sudo systemctl enable rc-local.service

https://askubuntu.com/a/770033/395498

แม้ว่าฉันจะไม่ได้ทดสอบวิธีแก้ปัญหาของเขาฉันคิดว่ามันฟังดูสมเหตุสมผลและใช้งานได้ อย่างไรก็ตาม:

ฉันยังพบวิธีแก้ไขปัญหาที่เพิ่มสคริปต์ใน. /.config/autostart-scripts/ จะทำการหลอกลวง


7
รับข้อผิดพลาดนี้ ไฟล์หน่วยไม่มีการกำหนดค่าการติดตั้ง (WantedBy, RequiredBy, นอกจากนี้การตั้งค่านามแฝงในส่วน [ติดตั้ง] และ DefaultInstance สำหรับหน่วยเทมเพลต) ซึ่งหมายความว่าพวกเขาไม่ได้ตั้งใจที่จะเปิดใช้งานโดยใช้ systemctl สาเหตุที่เป็นไปได้สำหรับการมีหน่วยประเภทนี้คือ: 1) หน่วยอาจถูกเปิดใช้งานแบบคงที่ด้วยการเชื่อมโยงจากไดเรกทอรีอื่น ๆ ที่ต้องการ / หรือ .requires / 2) จุดประสงค์ของหน่วยอาจจะทำหน้าที่เป็นผู้ช่วยสำหรับหน่วยอื่น ๆ ที่มีการพึ่งพาความต้องการ
Rıfat Erdem Sahin

ฉันยังได้รับข้อผิดพลาดนี้ด้วย หากrc.localปิดตัวเลือกอื่นคืออะไร
เบ็น

5

ลองsudo sysv-rc-confและตรวจสอบว่าrc.localมีการเปิดใช้งาน

rc.local         [ ]   [x]   [x]   [x]   [x]   [ ]   [ ]   [ ]

ใช่มันถูกเปิดใช้งาน
xx

จำเป็นต้องติดตั้งคำสั่งนี้หรือไม่
jcollum

1
@jcollum ใช่มันเป็นโปรแกรมจากแพ็คเกจที่ชื่อเดียวกัน ในการติดตั้งให้พิมพ์sudo apt install sysv-rc-conf
banan3'14

rc.localไม่ได้อยู่ในรายการบริการของฉัน!
เบ็น

4

ตรวจสอบให้แน่ใจว่าสคริปต์ rc.local สามารถทำงานได้:

sudo chmod +x /etc/rc.local

จากนั้นเปิดใช้งาน:

sudo systemctl enable rc-local.service

รีบูตระบบหรือเริ่มต้นสคริปต์ด้วยตนเองโดยเรียกใช้:

sudo systemctl start  rc-local.service

สถานะบริการสามารถแสดงผลได้โดยเรียกใช้:

$ sudo systemctl status rc-local.service
 rc-local.service - /etc/rc.local Compatibility
   Loaded: loaded (/lib/systemd/system/rc-local.service; static; vendor preset: enabled) 
Drop-In: /lib/systemd/system/rc-local.service.d
           └─debian.conf
   Active: active (running) since Mon 2018-04-02 10:39:44 -03; 1s ago
  Process: 2044 ExecStart=/etc/rc.local start (code=exited, status=0/SUCCESS)
 Main PID: 2049 (svscanboot)
Tasks: 3
 Memory: 556.0K
CPU: 10ms
CGroup: /system.slice/rc-local.service

คุณไม่จำเป็นต้องเปิดใช้งานบริการด้วยตนเอง หากไฟล์นั้นมีอยู่และสามารถใช้งานได้ systemd จะเปิดใช้งานrc-localบริการโดยอัตโนมัติ
muru

3

เราพบปัญหานี้ในเซิร์ฟเวอร์ที่โฮสต์บางเครื่องกำลังโหลดกฎ FW

ในกล่องเหล่านี้พวกเขาเริ่มต้นใหม่ได้อย่างรวดเร็วและเราพบเพียงแค่ใส่ "sleep 1" ใน rc.local ก่อนที่งบโหลดดูเหมือนว่าจะแก้ไขปัญหา ฉันเดาว่ามันให้เวลาเล็กน้อยสำหรับอินเทอร์เฟซในการชำระก่อนที่จะโหลดกฎ FW


1
ขอขอบคุณ. sleep 1แก้ไขปัญหาของฉัน น่าสนใจฉันมีเซิร์ฟเวอร์จำนวนมาก แต่มีเพียงปัญหาเดียวเท่านั้น
Qian Chen

1

ฉันเคยแก้ไขrc.localด้วย Notepad ใน Windows และเริ่มมีปัญหานี้

ในกรณีนี้การใช้โปรแกรมแก้ไขข้อความรองรับการแปลง EOL เช่น Notepad ++ เพื่อแปลงสไตล์ EOL เป็น 'Unix' อาจแก้ไขได้

คุณยังสามารถทำได้โดยใช้:set ff=unixVim


1

ฉันพบใน Ubuntu lxc container ว่าถ้า rc.local มี shebang ที่ถูกต้องอย่างสมบูรณ์เช่น

#!/bin/sh

มันล้มเหลว แต่ถ้าคุณลบ Shebang มันก็ใช้งานได้

ไม่ได้มาถึงจุดต่ำสุดว่าทำไมหรือใช้กระสุนแบบใดฉันคิดว่ามันระเบิดในระดับแรกที่ไม่เป็นศูนย์เช่นกัน (ใน Ubuntu อื่น ๆ ติดตั้ง shebang อย่างเหมาะสมไม่เป็นปัญหา)


0

คุณจะต้องตรวจสอบให้แน่ใจว่า/etc/rc.localมีการดำเนินการในระหว่างการเริ่มต้นเซิร์ฟเวอร์ด้วยคำสั่ง:

sudo systemctl enable rc-local.service

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