ฉันจะทำให้ "rc.local" ทำงานเมื่อเริ่มต้นได้อย่างไร


75

ฉันมีสคริปต์ที่ฉันต้องการเรียกใช้เมื่อระบบเริ่มทำงาน ฉันใส่ไว้ใน "rc.local" แต่มันไม่ทำงาน ฉันจะเปิดใช้งานเพื่อให้ทำงานเมื่อเริ่มต้นได้อย่างไร


1
คำสั่ง xsetwacom อยู่ที่ไหน /etc/rc.local ดำเนินการด้วย PATH ที่ง่ายมากเมื่อเริ่มต้น อาจแตกต่างจาก PATH ที่คุณลงชื่อเข้าใช้ที่เทอร์มินัล ในเทอร์มินัลให้พิมพ์: type -p xsetwacom จากนั้นแทนที่คำสั่ง "xsetwacom" ใน /etc/rc.local ด้วยพา ธ แบบเต็มซึ่งส่งคืนโดย "type -p" คุณต้องเริ่มต้นด้วยตนเองก่อนที่ xsetwacom จะเหมาะกับคุณหรือไม่?
waltinator

3
การใช้systemdเป็นตัวจัดการการเริ่มต้นตรวจสอบให้แน่ใจว่าความเข้ากันได้ของ rc.local กำลังทำงานอยู่:systemctl status rc-local.service
rubo77

ความเห็นของ waltinator เป็นปัญหาของฉัน เนื่องจากเส้นทางที่น้อยที่สุดจึงไม่รู้วิธีเรียกใช้สคริปต์ที่ฉันต้องการเรียกใช้ เส้นทางที่โหลดบนระบบ Ubuntu 14.04 ของฉันในเวลาที่ runninig /etc/rc.local มีดังต่อไปนี้: / sbin: / usr / sbin: / bin: / bin: / usr / bin ... คุณสามารถตรวจสอบด้วยการใส่echo $PATH > /home/rc_local_pathลงใน / etc / rc.local จากนั้นตรวจสอบไฟล์หลังจากเรียกใช้เมื่อเริ่มต้น
RaisinBranCrunch

โปรดทราบว่าหากสคริปต์ของคุณต้องทำงานอย่างต่อเนื่อง คุณจะต้องเริ่มเป็น daemonในrc.localไฟล์!
totymedli

ใช้sudo systemctl enable rc-local.serviceเพื่อให้แน่ใจว่า/etc/rc.local มีการดำเนินการในระหว่างการเริ่มต้นเซิร์ฟเวอร์
William

คำตอบ:


56

คุณสามารถเรียกใช้สคริปต์ด้วยตนเองได้หรือไม่? ถ้าไม่เป็นปัญหากับสคริปต์นั้น มิฉะนั้นดูเพิ่มเติมที่ rc.local (หากสคริปต์นั้นต้องทำงานเป็นรูทคุณต้องใช้ sudo เพื่อรันด้วยตนเอง)

ตรวจสอบให้แน่ใจว่า /etc/rc.local สามารถเรียกใช้งานได้และสคริปต์ที่เรียกใช้นั้นยังสามารถเรียกใช้งานได้

$ ls -l /etc/rc.local
-rwxr-xr-x 1 root root 419 2010-08-27 11:26 /etc/rc.local

ตรวจสอบให้แน่ใจว่า rc.local มีเส้น shebang (ซึ่งเป็นค่าเริ่มต้น):

$ head -n1 /etc/rc.local
#!/bin/sh -e

ใช่ฉันสามารถเรียกใช้สคริปต์ด้วยตนเอง ฉันจะแน่ใจได้อย่างไรว่า /etc/rc.local สามารถเรียกใช้งานได้? ฉันต้องพิมพ์อะไร เป็น "$ ls -l /etc/rc.local -rwxr-xr-x 1" หรือไม่ ขอบคุณ!
pedroo

@pedroo: ฉันได้คัดลอกสิ่งที่ฉันเห็นในเทอร์มินัลของฉัน (ดังนั้นคุณจะเห็นพร้อมท์อินพุตและเอาต์พุตด้านบนทั้งหมด) คำสั่งคือ "ls -l /etc/rc.local" และหากสามารถเรียกใช้งานได้จะมี Xs เหล่านั้นในเอาต์พุต

3
ฉันได้ลองใช้ "ls -l /etc/rc.local" และสามารถใช้งานได้ แต่ฉันไม่สามารถเรียกใช้เมื่อเริ่มต้น ... ความคิดใด ๆ
pedroo

1
@pedroo: ต้องการให้เซิร์ฟเวอร์ X ทำงานอยู่ซึ่งจะไม่เกิดขึ้นเมื่อมีการเรียกใช้งาน rc.local เรียกใช้จาก rc.local จะทำให้มันออกโดยไม่ต้องทำอะไร (แม้ว่าฉันหวังว่ามันจะทำให้ข้อความใน syslog หรือที่อื่น ๆ ) คุณต้องใส่คำสั่ง xsetwacom ใน ~ / .xinitrc หรือ / etc / X / xinit / xinitrc แทน

1
@pedroo: เนื่องจาก rc.local มีคำสั่งที่ตั้งใจให้ทำงานในเวลาอื่น สร้างไฟล์ใหม่คุณสามารถวางไว้ใน~ / binทำเครื่องหมายไฟล์ที่เรียกใช้งานได้ (chmod หรือคุณสมบัติใน Nautilus) สร้างบรรทัดแรก "#! / bin / bash" จากนั้นใส่คำสั่งของคุณในบรรทัดต่อมา

53

ในกรณีของฉันไม่มีคำแนะนำใด ๆ ที่เป็นทางออกที่สมบูรณ์แบบ หากคุณโชคร้ายเหมือนฉันลองอันนี้โดยละเอียด

  1. ใส่รหัสการดำเนินการทั้งหมดของคุณในไฟล์ข้อความที่แยกต่างหากพร้อมกับชื่อที่กำหนดเองเช่น foo.sh และบันทึกไว้ในที่ที่กำหนดเอง
  2. เพิ่ม

    #!/bin/sh

    เป็นบรรทัดแรกของรหัสของคุณ

  3. ลองดำเนินการ foo.sh ของคุณโดย

    sudo foo.sh

    เพื่อตรวจสอบว่าไม่มีข้อผิดพลาดเลย

  4. จัดเตรียมสคริปต์ /etc/rc.local ของคุณพร้อมกับพา ธ เต็มและชื่อของสคริปต์ที่คุณสร้างหลังจากคำสั่ง sh

    sh '/path/to/your/script/foo.sh'
  5. อย่าลืมใส่บรรทัดด้านบนหน้าบรรทัดสุดท้ายของโค้ด

    exit 0

    ในตอนท้ายของสคริปต์ /etc/rc.local

  6. ตรวจสอบบรรทัดแรกของ /etc/rc.local ว่าเป็น

    #!/bin/sh -e
  7. ทำให้ไฟล์ /etc/rc.local ของคุณสามารถใช้งานได้ในกรณีที่ยังไม่สามารถใช้งานได้

    sudo chown root /etc/rc.local
    sudo chmod 755 /etc/rc.local
    
  8. ตรวจสอบทุกอย่างทำงานได้ดีโดยดำเนินการ

    sudo /etc/init.d/rc.local start
  9. ทดสอบการเริ่มระบบของคุณใหม่

6
ขั้นตอนที่ # 8 เป็นกุญแจสำคัญในการตรวจสอบว่าสคริปต์จะทำงานภายใต้สภาพแวดล้อมการเริ่มต้น ในกรณีของฉันฉันต้องให้เส้นทางแบบเต็มกับคำสั่ง
Peter Gluck

นายอำเภอและขั้นตอนที่ยอดเยี่ยมมันทำงานบน Centos แต่sudo /etc/rc.local startทำงานครั้งแรก
A1Gard

ขอบคุณ - การพังทลายนี้ช่วยฉันได้มากและขั้นตอนที่ # 8 เป็นกุญแจสำคัญสำหรับฉันเช่นกัน! หากไม่มีมันก็จะไม่เปลี่ยนเส้นทาง +1 (สำหรับการอ้างอิงแอปโหนดที่ทำงานบนเซิร์ฟเวอร์คลาวด์ bitnami ที่ใช้ตลอดไปสำหรับการทำงานอย่างต่อเนื่อง)
fidev

ขั้นตอนที่ 8 เป็นเคล็ดลับที่ดี แต่ฉันคิดว่าขั้นตอนที่ 7 อาจจะมีสิ่งที่คงที่ฉันฉันพยายามที่จะเรียกใช้สคริปต์โดยใช้ cron เพื่อเปิดอุโมงค์ แต่มันก็เป็นความล้มเหลวในการสุ่ม
SeanClt

28

สำหรับ Ubuntu รุ่นใหม่กว่าsystemdนั้นจะใช้งานและ/etc/rc.localจะไม่โหลดตามค่าเริ่มต้นเสมอ

ตรวจสอบว่ามีการโหลดบริการความเข้ากันได้ด้วยหรือไม่

systemctl status rc-local.service

ภาพหน้าจอ

หากมีการใช้งาน (ออก)การตั้งค่าของคุณดูเหมือนดีและคุณอาจมีข้อผิดพลาดอื่นใน/etc/rc.localไฟล์ของคุณ(นี่อาจเป็นคำสั่งที่ล้มเหลวตัวอย่างเช่น)


4
ถ้า rc-local.service ไม่ได้เปิดใช้งานให้ตรวจสอบโพสต์นี้ที่อธิบายถึงวิธีการเปิดใช้งาน /etc/rc.local ด้วย Systemd
yaitloutou

3

2 ข้อเสนอแนะ

  1. ตรวจสอบให้แน่ใจว่าไฟล์สคริปต์ปลายทางถูกทำเครื่องหมายว่าสามารถเรียกทำงานได้
  2. สคริปต์เป้าหมายรันคำสั่งsudoหรือไม่? ถ้าเป็นเช่นนั้นคุณอาจต้องการให้รหัสผ่าน sudo

ความผิดฉันเอง. เพียงตรวจสอบหนึ่งแล้ว ขอบคุณสำหรับการแก้ไข enzotib :)


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