เรียกใช้สคริปต์ Python เมื่อเริ่มต้น


29

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

Pi ของฉันทำงาน Raspbian ฉันมีสคริปต์ Python ชื่อ dnscheck.py ซึ่งวนซ้ำตลอดไป

ฉันต้องการให้มันทำงานตอนบูท ฉันรู้ว่าฉันต้องสร้างไฟล์. sh ที่มีบางอย่างเช่น

sudo python dnscheck.py &

สิ่งที่ฉันไม่รู้ก็คือไฟล์นี้ควรอยู่ที่ใดหรือควรมีอะไรอีก ฉันรู้เกี่ยวกับโฟลเดอร์ init.d แต่การเห็นตัวอย่างโครงกระดูกฉันคิดว่าควรมีวิธีที่ง่ายกว่าในการทำงานง่ายๆนี้


สำหรับวิธีการชำระเงินที่ง่ายจริง ๆ ขั้นตอนการสอนแบบทีละขั้นตอน -> youtu.be/Tvnrx-2QaUUทำให้ตัวเรียกใช้งานมากเท่าที่คุณต้องการและอยู่ทั้งหมดใน crontab
Hossein RM

คำตอบ:


20

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

/etc/rc.localถ้าคุณเพียงต้องการกระบวนการที่จะเริ่มต้นการใส่คำสั่งลง (ฉันไม่มี RPi อยู่ในมือ แต่ฉันอ่านออนไลน์ว่ามีบรรทัด 'exit 0' อยู่ที่นั่นคุณควรวางคำสั่งของคุณไว้เหนือบรรทัดนี้)


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

7
"ตามที่คุณเขียนไว้ในคำถามของคุณ"ไม่มาก - คุณไม่จำเป็นต้องใช้ sudo เมื่อrc.localทำงานรูท คุณควรระบุพา ธ ที่สมบูรณ์ไปยังสคริปต์อย่างชัดเจน นอกจากนี้คุณยังควรเพิ่ม&/path/to/foobar.py &ในตอนท้ายเพื่อให้ส้อมสคริปต์เช่น
goldilocks

1
@goldilocks คุณจะกรุณาอธิบายว่าทำไมฉันจะต้องเพิ่ม&? เพราะเมื่อฉันใช้โดยไม่มีมันทุกอย่างยังคงทำงานตามที่คาดไว้
Huy.PhamNhu

2
@ Huy.PhamNhu ตอบคำถามของคุณ: Pi จะเรียกใช้โปรแกรมนี้เมื่อเริ่มต้นระบบและก่อนที่จะเริ่มบริการอื่น ๆ หากคุณไม่ได้รวมเครื่องหมายและหากโปรแกรมของคุณทำงานอย่างต่อเนื่อง Pi จะไม่ทำกระบวนการบู๊ตให้เสร็จสมบูรณ์ เครื่องหมายแอมเปอร์แซนด์อนุญาตให้คำสั่งรันในกระบวนการแยกต่างหากและทำการบู๊ตต่อโดยกระบวนการหลักรันอยู่
Amine Harbaoui

6

ย้ายสคริปต์ของคุณ (เราจะบันทึกลงในไฟล์dnscheck) ไปที่/etc/init.d/และตั้งค่าการอนุญาตเพื่อให้สามารถเรียกใช้:

chmod 755 /etc/init.d/dnscheck

เพิ่มแท็ก LSB initที่ด้านบนสุดของสคริปต์ของคุณ คุณอาจต้องการเปลี่ยน Required-Start / Stop และแท็กคำอธิบายให้เหมาะกับสคริปต์ของคุณ

### BEGIN INIT INFO
# Provides:          dnscheck
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       Enable service provided by daemon.
### END INIT INFO

จากนั้นสร้างลิงก์สัญลักษณ์โดยเรียกใช้

update-rc.d /etc/init.d/dnscheck defaults

2
โปรดอย่าว่าในขณะที่นี่เป็นคำตอบที่ดี 3 1/2 ปีที่แล้วและจะยังคงใช้งานได้เนื่องจากระบบ init ใหม่ของ Raspbian นั้นเข้ากันได้กับสคริปต์สไตล์ LSB / SysV ผู้ใช้ใหม่จะดีกว่าการเรียนรู้ที่จะใช้ระบบใหม่แทน ( systemd ) หากเพิ่งเพิ่มบรรทัดไปยัง/etc/rc.localไม่เพียงพอ
goldilocks

3

cronมีหลายวิธีที่จะทำแบบนี้แน่นอนอย่าลืมใช้มี แต่ หากคุณใส่@rebootบรรทัดใน crontab ของคุณคำสั่งนั้นจะถูกดำเนินการทุกครั้งที่รีสตาร์ท

ในการทดสอบฉันเพิ่งเพิ่มบรรทัดต่อไปนี้ให้กับผู้ใช้ crontab ด้วยcrontab -e: @reboot echo "$(date)" >> ~/boot.txt โบนัสของวิธีนี้คือคุณสามารถโทรหางานตามที่ต้องการในช่วงเวลาอื่นนอกเหนือจากเวลาบูตและคุณไม่ต้องแก้ไขสคริปต์เริ่มต้น


3

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

#!/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.

exec 2> /tmp/rc.local.log      # send stderr from rc.local to a log file
exec 1>&2                      # send stdout to the same log file

# Your other commands...

exit 0

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


3

ฉันประหลาดใจจริง ๆ ที่daemontoolsของ djb ไม่ได้กล่าวถึงที่นี่ Daemontools ทำการควบคุมกระบวนการที่เหมาะสมและคุณสามารถเพิ่มคุณสมบัติเจ๋ง ๆ เช่นการบันทึกที่หมุนโดยอัตโนมัติ TL; DR หากคุณไม่คุ้นเคยกับสิ่งนี้กระบวนการของคุณจะเริ่มใหม่ทุกครั้งที่ล้มเหลวและเริ่มต้นโดยอัตโนมัติเมื่อ Pi ของคุณเปิด สิ่งนี้ดีมากถ้าคุณเขียนโปรแกรมหลามที่มีโหมดความล้มเหลว แต่คุณไม่ต้องการให้มันตายถ้าเกิดข้อผิดพลาด

ติดตั้ง:

sudo apt-get install daemontools daemontools-run

จากนั้นทำตามขั้นตอนเพื่อสร้างกระบวนการที่ daemonized:

ส่วนใหญ่นั้นง่ายเหมือนการคัดลอกrunสคริปต์ไปยัง/etc/service/<my_custom_service_name>Another perk: คุณสามารถเรียกใช้ในฐานะผู้ใช้หรือรูทใดก็ได้! รายละเอียดในลิงค์

FWIW ฉันมีโปรเจ็กต์ Pi ซึ่งฉันมีโพรเซสหลาม 3 โพรเซส (แต่ละโพรเซสมีการวนรอบการประมวลผลโดยใช้เวลาของ CPU ดังนั้นโดยใช้ 3 โพรเซสที่ฉันอนุญาตให้แต่ละโพรเซส Daemontools อนุญาตให้ฉันตรวจสอบให้แน่ใจว่าทั้ง 3 จะทำงานโดยอัตโนมัติและทำงานต่อไปหลังจากที่ฉันเสียบ Pi


ทางออกที่ง่ายและสะดวกคุณได้รับคำตอบประหยัดเวลาได้มากขอบคุณ ..
ShivaGuntuku

2

นี่คือทางออกที่ฉันใช้อยู่ตลอดเวลา

สร้างไฟล์เดสก์ท็อป

xyz.desktop

พิมพ์สิ่งต่อไปนี้ลงไป

[Desktop Entry]
Encoding=UTF-8
Type=Application
Name=<Application Name Goes here>
Comment=
Exec=  python /home/pi/Desktop/execute_on_boot.py
StartupNotify=false
Terminal=true
Hidden=false

วางไฟล์นี้ลงใน

/home/pi/.config/autostart/

และรีสตาร์ท raspberry pi ของคุณและควรรันโปรแกรมของคุณโดยอัตโนมัติในเทอร์มินัลใหม่


โปรดอย่าตัดและวางคำตอบสำหรับคำถามหลายข้อ หากคำตอบเหมือนกันเวอร์ชั่นใหม่ควรถูกแฟล็กเป็นสำเนา
Steve Robillard

เหตุผลเดียวที่ฉันไม่ได้ทำเพราะหน้านี้มีจำนวนการดูมากกว่าเมื่อเทียบกับอีกหน้าหนึ่ง
Evolutionizer

@SteveRobillard ฉันยังไม่คิดว่าฉันมีตัวแทนที่ต้องทำเช่นนั้น
evolutionizer

การตั้งค่าสถานะโพสต์จะใช้เวลา 15 ตัวแทน การตัดสินใจว่าจะทำอย่างไรกับมันคืองานของผู้ดำเนินรายการ - ดังนั้นจำนวนการดูจึงไม่เกี่ยวข้อง คำตอบที่ซ้ำกันจะทำเครื่องหมายโดยระบบโดยอัตโนมัติ พวกเขาเป็นรูปแบบของการเล่นเกมระบบ ดังนั้นฉันจึงลบอันที่สาม
Steve Robillard

@SteveRobillard ขอบคุณสำหรับข้อมูลและให้อภัยความไม่รู้ของฉัน ฉันมีสำหรับการตั้งค่าสถานะคำถามก่อนหน้านี้ว่าซ้ำกัน
Evolutionizer

2

ในการใช้ไฟล์. py เพียงแค่ใส่บรรทัด#!/usr/bin/pythonที่จุดเริ่มต้นของไฟล์ของคุณ chmod +x filenameแล้วทำให้มันปฏิบัติการด้วย ถัดไปเพิ่มเส้น/path/to/file.py &ไป/etc/rc.localก่อนที่จะexit 0สาย (แลก/path/to/file.pyกับเส้นทางไปยังสคริปต์ของคุณ) นี่จะทำให้สคริปต์ไพ ธ อนของคุณทำงานเมื่อสิ้นสุดการบู๊ต


0

นี่เป็นวิธีที่ง่ายกว่าสำหรับฉัน แก้ไขการเริ่มอัตโนมัติใน LXDE

เปิดเทอร์มินัลและแก้ไขไฟล์ autostart ดังนี้:

sudo nano /home/pi/.config/lxsession/LXDE-pi/autostart

เพิ่มบรรทัดข้อความต่อไปนี้ที่ด้านล่าง (ปรับเปลี่ยนเส้นทางตามที่จำเป็นในตำแหน่งที่ example.py ตั้งอยู่)

@/usr/bin/python /home/pi/example.py

ctr-x และบันทึก คุณอาจต้องทำให้สคริปต์ python ทำงานได้ดังต่อไปนี้:

sudo chmod +x /home/pi/example.py

การอ้างอิงสำหรับการเริ่มอัตโนมัติใน LXDE และการอ้างอิงสำหรับการทำให้สามารถใช้งานโปรแกรมหลามได้


โปรดทราบว่าสิ่งนี้จะไม่ทำงานหากคุณไม่ได้เริ่มต้นใน gui (เช่น: เรียกใช้ pi ของคุณหัวขาด)
Havnar

0

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

เปิดเทอร์มินัลเซสชันและแก้ไขไฟล์

sudo nano /etc/profile

เพิ่มบรรทัดต่อไปนี้ในตอนท้ายของไฟล์

/home/pi/your_script_name.sh

แทนที่ชื่อสคริปต์และเส้นทางด้วยชื่อที่ถูกต้องและเส้นทางของสคริปต์เริ่มต้นของคุณ บันทึกและออก

กด Ctrl + X เพื่อออกจากโปรแกรมแก้ไข nano ตามด้วย Y เพื่อบันทึกไฟล์

นี่คือสิ่งที่ script.sh ของฉันดูเหมือน:

#!/bin/sh
cd /
cd home/pi/
sudo python your_python_sript.py &
exit 0
cd /

ฉันคิดว่าฉันสร้างทั้ง script.sh และ script.py ที่ปฏิบัติการได้โดยใช้ chmod

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