วิธีเริ่มแอปพลิเคชันโดยอัตโนมัติเมื่อบูต


27

ฉันยังใหม่กับ Linux และรอคอยที่จะเริ่มต้นแอปพลิเคชัน (ซึ่งจะนำไปสู่การเปลี่ยนทุกๆ 10 วินาที) ฉันได้เขียนโปรแกรมแอปพลิเคชัน & มันทำงานได้ดี แต่ตอนนี้ฉันต้องการที่จะเริ่มโดยอัตโนมัติเมื่อบูต

เอกสารอธิบายที่นี่เพื่อคัดลอกสคริปต์เริ่มต้นไปยัง/etc/init.dไดเรกทอรีและสร้างลิงก์สัญลักษณ์ไปยังสคริปต์ที่คัดลอกในrc.dไดเรกทอรี

สิ่งที่ควรเป็นนามสกุลและชื่อของไฟล์สคริปต์เหล่านี้? เราสามารถเพิ่มลิงค์สัญลักษณ์ด้วยตนเองrc.dหรือมีขั้นตอนเฉพาะสำหรับเรื่องนี้ได้หรือไม่?

ข้อเสนอแนะวิธีการบรรลุมันได้หรือไม่


วิธีที่ต้องการเพิ่มสคริปต์เริ่มต้นเพื่อเริ่มต้นแตกต่างกันไปตาม distros บางคนถึงกับทำให้พวกมันพุ่งพรวดและพุ่งพรวด ฉันจะไม่แนะนำเพียงแค่ใช้ "&" เป็นแบ็คกราวน์เนื่องจากสิ่งที่ Debian start-stop-daemonจัดการได้ดีกว่า คุณใช้ distro อะไร นอกประเภท MIME บนเดสก์ท็อปนามสกุลไฟล์นั้นไม่มีความหมายใน * nix และเป็นที่ต้องการที่ไฟล์ปฏิบัติการไม่มี
จอร์แดน

หากคุณกำลังใช้ petalogix เพียงทำตามเอกสารนั้น - ไม่จำเป็นต้องใช้ชื่อพิเศษ คุณลองหรือยัง คุณมีปัญหาอะไร (ถ้าไม่ได้โปรดระบุ distro ของคุณและอธิบายสิ่งที่ไม่ได้ทำงานกับสิ่งที่คุณพยายาม.)
จ้า

ฉันกำลังใช้ Debian“ เสียงดัง” สำหรับ RPi
หุบ

1
ถ้าคุณต้องการที่จะทำมันประมาณทุกๆ 10 วินาที (เช่นไม่คมชัด 10 วินาที) คุณอาจต้องการที่จะใช้cronแทน
เตอร์

@ peterph: แต่ดูเหมือนว่าโปรแกรมจะสลับ LED ทุก ๆ 10 วินาทีไม่ใช่โปรแกรมที่ทำงานทุก 10 วินาที
Zorawar

คำตอบ:


19

นี่คือข้อความที่ตัดตอนมาจากhttp://www.debian-administrator.org/articles/28ซึ่งดูเหมือนจะตอบคำถามของคุณ

หมายเหตุ: ในตัวอย่างสคริปต์ด้านล่างเพียงเพิ่มการเรียกไปยังส่วน " start)" เพื่อเปิดใช้โปรแกรมของคุณจริง คุณสามารถทดสอบการทำงานของสคริปต์โดยไม่ต้องรีบูตระบบ: เรียกใช้ด้วยพา ธ เต็มและกำหนดพารามิเตอร์เป็น " start" หรือ " stop"

ไปที่นี่:

Debian ใช้ Sys-V เช่นระบบ init สำหรับการดำเนินการคำสั่งเมื่อระบบมีการเปลี่ยนแปลงระดับ - ตัวอย่างเช่นตอนบูทเครื่องและเวลาปิดเครื่อง

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

ต่อไปนี้เป็นสคริปต์ที่ง่ายมากซึ่งแบ่งออกเป็นสองส่วนคือรหัสที่มักจะเรียกใช้และรหัสที่ทำงานเมื่อเรียกด้วย "เริ่มต้น" หรือ "หยุด"

#! /bin/sh
# /etc/init.d/blah
#

# Some things that run always
touch /var/lock/blah

# Carry out specific functions when asked to by the system
case "$1" in
  start)
    echo "Starting script blah "
    echo "Could do more here"
    ;;
  stop)
    echo "Stopping script blah"
    echo "Could do more here"
    ;;
  *)
    echo "Usage: /etc/init.d/blah {start|stop}"
    exit 1
    ;;
esac

exit 0

เมื่อคุณบันทึกไฟล์ไว้ในตำแหน่งที่ถูกต้องตรวจสอบให้แน่ใจว่าสามารถเรียกใช้ไฟล์ได้โดยเรียกใช้ " chmod 755 /etc/init.d/blah"

จากนั้นคุณต้องเพิ่มลิงก์สัญลักษณ์ที่เหมาะสมเพื่อให้สคริปต์ทำงานเมื่อระบบหยุดทำงานหรือเกิดขึ้น

วิธีที่ง่ายที่สุดในการทำเช่นนี้คือใช้คำสั่ง Debian เฉพาะupdate-rc.d:

root@skx:~# update-rc.d blah defaults
 Adding system startup for /etc/init.d/blah ...
   /etc/rc0.d/K20blah -> ../init.d/blah
   /etc/rc1.d/K20blah -> ../init.d/blah
   /etc/rc6.d/K20blah -> ../init.d/blah
   /etc/rc2.d/S20blah -> ../init.d/blah
   /etc/rc3.d/S20blah -> ../init.d/blah
   /etc/rc4.d/S20blah -> ../init.d/blah
   /etc/rc5.d/S20blah -> ../init.d/blah

ฉันต้องวางสคริปต์นี้ใน etc / init.d / หรือบรรทัดที่ด้านบน # /etc/init.d/blah แสดงตำแหน่งของเชลล์
user137717

ฉันได้รับ "-sh: update-rc.d: ไม่พบคำสั่ง"
m4l490n

2
ระบบที่ใหม่กว่าใช้systemdสำหรับหลาย ๆ อย่างรวมถึงการกำหนดค่าการบูต ใช้ในการควบคุมและการกำหนดค่าsystemctl systemd
Alexander Shcheblikin

4

วิธีที่ดีที่สุดคือการตรวจสอบแหล่งแพ็กเกจของการแจกจ่ายสำหรับบริการระบบปกติเช่น OpenSSH คุณจะเห็นว่าแนวปฏิบัติที่ดี ท้ายที่สุดหนึ่งในเหตุผลที่อยู่เบื้องหลังโอเพ่นซอร์สคือเพื่อให้สามารถเรียนรู้จากแหล่งที่มา


2
คำแนะนำที่ยอดเยี่ยม! ฉลาดและมีความเกี่ยวข้องอย่างแท้จริงและปรับไปยัง Distos ทั้งหมด (และบังเอิญตอบ "ใหม่ลินุกซ์" และ "ฉันจะทำมัน" ส่วนหนึ่งของคำถามที่ผมจะใช้คำตอบนี้ในการปรับปรุงของฉันสคริปต์เริ่มต้นหยุด..
Bruce0

3

ใช้ Supervisor โปรแกรมที่มีประสิทธิภาพที่จัดการและบันทึกแอปพลิเคชันเริ่มต้นด้วยข้อโต้แย้ง เรียนรู้เพิ่มเติมจากhttp://supervisord.org/running.htmlและ (ทำตามคำแนะนำการติดตั้ง

สร้างไฟล์ conf ที่/etc/supervisor/conf.d/{PROGRAM_NAME}.confและนี่คือรหัส

[program:{PROGRAM_NAME}]
command=/usr/bin/{PROGRAM_NAME} -arg1 -arg2
autostart=true  
autorestart=true  
stderr_logfile=/var/log/supervisor/{PROGRAM_NAME}.err.log  
stdout_logfile=/var/log/supervisor/{PROGRAM_NAME}.out.log  

จากนั้นดำเนินการจากบรรทัด cmd:

supervisorctl reload


ในขณะที่คำตอบของคุณจะดีผมคิดว่าคุณควรเปลี่ยนมันแสดงให้เห็นว่า "supervisorctl โหลด" จะได้รับการดำเนินการจาก CLI ที่ไม่ถูกแทรกในไฟล์ .conf
dlewin

3

การใช้crontabง่ายกว่ามาก

ใช้crontab -eเพื่อแก้ไข crontab ของผู้ใช้
เพิ่มบรรทัดต่อไปนี้ในตอนท้าย:

@reboot <command>

ตัวอย่าง:

  • @reboot my_script.sh
  • @reboot python my_script.py arg1 arg2

สุดท้ายใช้crontab -lเพื่อให้แน่ใจว่าสคริปต์ของคุณถูกเพิ่มลงในรายการ


ฉันสงสัยว่าทำไมคำตอบนี้จึงได้รับการโหวต ดูเหมือนว่าเป็นวิธีการแก้ปัญหาที่ง่ายมากและอีกวิธีหนึ่งที่ใช้ crontab ซึ่งทุกคนคงรู้จักและเข้าใจอยู่แล้ว
kolinko

1

การสนับสนุน linux รุ่นใหม่กว่าsystemd(ดังที่ @AlexanderShcheblikin พูด) มันมีคุณสมบัติมากกว่าและพกพาได้มากกว่าโซลูชันเฉพาะของเดเบียน

โปรดอ่าน คู่มือที่ยอดเยี่ยมนี้

นี่คือการอ้างอิงด่วนของขั้นต่ำเปล่าที่ต้องการ:

  1. สคริปต์ (เช่นmyscript.sh) ที่มีสิทธิ์การใช้งาน
  2. ไฟล์หน่วย (เช่นmyservice.service) พร้อมส่วนขยาย ".service" ที่/etc/systemd/systemมีสิทธิ์ 644 ที่มีคำสั่งในการเรียกใช้งานสคริปต์ ตัวอย่างเช่น,

:

[Unit]
Description=Example systemd service.

[Service]
Type=simple
ExecStart=/bin/bash /path/to/myscript.sh

[Install]
WantedBy=multi-user.target
  1. เรียกใช้คำสั่งsudo systemctl enable myserviceเพื่อเปิดใช้งานเมื่อเริ่มต้นระบบ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.