Chạy tập lệnh Python khi khởi động


29

Câu hỏi này đã được hỏi khá nhiều lần trước đây nhưng tôi dường như không làm cho nó hoạt động bằng cách sử dụng thông tin hiện có.

Pi của tôi chạy Raspbian. Tôi có một tập lệnh Python có tên dnscheck.py sẽ lặp lại.

Tôi cần nó để chạy khi khởi động. Tôi biết tôi phải tạo một tệp .sh có chứa một cái gì đó như

sudo python dnscheck.py &

Những gì tôi không biết là nơi tập tin này nên hoặc nếu nó nên chứa bất cứ điều gì khác. Tôi biết về thư mục init.d, nhưng nhìn thấy ví dụ về bộ xương tôi tưởng tượng nên có một cách đơn giản hơn để thực hiện nhiệm vụ đơn giản này.


để có cách dễ dàng thực sự kiểm tra hướng dẫn từng bước này -> youtu.be/Tvnrx-2QaUU hãy tạo ra nhiều launcher như bạn cần và nhập tất cả chúng trong crontab
Hossein RM

Câu trả lời:


20

Nếu bạn muốn kiểm soát quá trình bằng các lệnh như bắt đầu, dừng, khởi động lại, v.v ... bằng cách sử dụng tập lệnh skeleton và thay đổi nó cho mục đích của bạn có thể là lựa chọn tốt nhất.

Nếu bạn chỉ muốn quá trình bắt đầu, hãy đặt lệnh vào /etc/rc.local. (Tôi không có RPi trong tay, nhưng tôi đọc trên mạng rằng có một dòng 'thoát 0' trong đó, bạn nên đặt lệnh của bạn trên dòng này)


1
Nó đã làm việc! Tôi phải thêm rằng thiết lập quyền cho tập lệnh và RC.local trở lại 755 (đọc / ghi / thực thi) là bắt buộc. Không chắc cả hai có cần cài đặt này không, nhưng nó hoạt động với tôi. Cảm ơn rất nhiều vì sự giúp đỡ!
Vlad Schnakovszki

7
"như bạn đã viết nó trong câu hỏi của bạn" Không hoàn toàn - bạn không cần sudo như rc.localchạy root. Rõ ràng, bạn cũng nên xác định đường dẫn đầy đủ đến tập lệnh. Bạn cũng nên thêm& vào cuối để kịch bản rẽ nhánh, vd /path/to/foobar.py &.
goldilocks

1
@goldilocks bạn có thể vui lòng giải thích tại sao tôi cần thêm &? Bởi vì khi tôi sử dụng mà không có nó, mọi thứ vẫn hoạt động như mong đợi.
Huy.PhamNhu

2
@ Huy.PhamNhu Trả lời câu hỏi của bạn: Pi sẽ chạy chương trình này khi khởi động và trước khi các dịch vụ khác được bắt đầu. Nếu bạn không bao gồm ký hiệu và nếu chương trình của bạn chạy liên tục, Pi sẽ không hoàn thành quá trình khởi động. Dấu và cho phép lệnh chạy trong một tiến trình riêng biệt và tiếp tục khởi động với tiến trình chính đang chạy.
Amine Harbaoui

6

Di chuyển tập lệnh của bạn (chúng tôi sẽ lưu tập tin vào tệp dnscheck) /etc/init.d/và đặt quyền để có thể chạy:

chmod 755 /etc/init.d/dnscheck

Thêm thẻ init LSB vào đầu tập lệnh của bạn. Bạn có thể sẽ muốn thay đổi Bắt đầu / Bắt đầu / Dừng và Thẻ Mô tả để phù hợp với tập lệnh của bạn.

### 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

Sau đó tạo các liên kết tượng trưng bằng cách chạy

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

2
Xin lưu ý rằng đây không phải là một câu trả lời đúng cách đây 3 năm rưỡi, và vẫn sẽ hoạt động vì hệ thống init mới của Raspbian tương thích ngược với các tập lệnh kiểu LSB / SysV, thay vào đó người dùng mới nên học cách sử dụng hệ thống mới ( systemd ) nếu chỉ thêm một dòng vào /etc/rc.locallà không đủ.
goldilocks

3

Tất nhiên, có nhiều cách để làm điều này, nhưng đừng quên sử dụng cron. Nếu bạn đặt một @rebootdòng trong crontab của bạn, lệnh đó sẽ được thực thi mỗi lần khởi động lại.

Để kiểm tra, tôi chỉ cần thêm dòng sau vào crontab người dùng của mình với crontab -e: @reboot echo "$(date)" >> ~/boot.txt Phần thưởng cho phương pháp này là bạn có thể gọi công việc theo yêu cầu tại các khoảng thời gian khác ngoài thời gian khởi động và bạn không phải chỉnh sửa tập lệnh init.


3

nếu bạn sử dụng tệp RC.local, điều này có thể hữu ích để khắc phục sự cố. Bạn có thể thêm các dòng ghi nhật ký vào lỗi đăng nhập (stderr) và đầu ra lệnh (stdout) vào tệp nhật ký. Theo ví dụ này, tập tin lưu trong /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

Đọc thêm


3

Tôi thực sự ngạc nhiên khi daemontools của djb không được đề cập ở đây. Daemontools thực hiện giám sát quy trình phù hợp và bạn có thể thêm các tính năng thú vị như ghi nhật ký tự động xoay. TL; DR nếu bạn không quen với bất kỳ điều nào trong số này, quy trình của bạn sẽ được khởi động lại mỗi khi nó bị lỗi và tự động bắt đầu khi Pi của bạn bật. Điều này thật tuyệt nếu bạn đã viết một chương trình python xấu có chế độ thất bại nhưng bạn không muốn nó chết nếu gặp lỗi.

Cài đặt, dựng lên:

sudo apt-get cài đặt daemontools daemontools-run

Sau đó làm theo các bước để tạo quy trình daemonized:

Nó đơn giản như việc sao chép runtập lệnh vào /etc/service/<my_custom_service_name>một lợi ích khác: bạn có thể chạy như bất kỳ người dùng hoặc root nào! Chi tiết trong liên kết.

FWIW Tôi đã có một dự án Pi trong đó tôi có 3 quy trình python khác nhau (mỗi quy trình có một vòng lặp thực thi sử dụng thời gian CPU vì vậy bằng cách sử dụng 3 quy trình tôi đã cho phép mỗi quy trình tận dụng 1 lõi CPU). Daemontools cho phép tôi đảm bảo cả 3 sẽ tự động chạy và duy trì hoạt động sau khi tôi cắm Pi.


Giải pháp đơn giản và dễ dàng, bạn trả lời tiết kiệm được nhiều thời gian, cảm ơn ..
ShivaGuntuku

2

Đây là giải pháp mà tôi liên tục sử dụng.

Tạo một tập tin máy tính để bàn

xyz.desktop

gõ như sau vào nó

[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

dán tập tin này vào

/home/pi/.config/autostart/

và khởi động lại pi mâm xôi của bạn và nó sẽ tự động chạy chương trình của bạn trong một thiết bị đầu cuối mới


xin vui lòng không cắt và dán câu trả lời cho nhiều câu hỏi. Nếu câu trả lời giống nhau, phiên bản mới hơn sẽ được gắn cờ là bản sao.
Steve Robillard

Lý do duy nhất tôi không làm là vì trang này có số lượt xem lớn hơn so với trang kia.
tiến hóa

@SteveRobillard Tôi cũng không nghĩ mình có đại diện bắt buộc phải làm như vậy
Evolutionizer

Gắn cờ một bài chỉ mất 15 rep. Quyết định những gì cần làm về nó là công việc của người điều hành - vì vậy số lượt xem là không liên quan. Câu trả lời trùng lặp được hệ thống tự động gắn cờ. Họ là một hình thức chơi game hệ thống. Do đó, tôi đã xóa cái thứ ba.
Steve Robillard

@SteveRobillard Cảm ơn thông tin và tha thứ cho sự thiếu hiểu biết của tôi. Tôi đã ở đó để đánh dấu câu hỏi trước đó là trùng lặp.
tiến hóa

2

Để sử dụng tệp .py, chỉ cần đặt dòng #!/usr/bin/pythonở đầu tệp của bạn. Sau đó làm cho nó thực thi với chmod +x filename. Tiếp theo, thêm dòng /path/to/file.py &vào /etc/rc.localtrước exit 0dòng (hoán đổi /path/to/file.pyvới đường dẫn đến tập lệnh của bạn). Điều này sẽ làm cho kịch bản python của bạn thực thi khi kết thúc khởi động.


0

Đây là một phương pháp thậm chí còn dễ dàng hơn đối với tôi. Sửa đổi tự động khởi động trong LXDE.

Mở một thiết bị đầu cuối và chỉnh sửa tập tin tự động khởi động như sau:

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

thêm dòng văn bản sau vào dưới cùng (sửa đổi đường dẫn nếu cần đến vị trí example của bạn)

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

ctr-x, và lưu. Bạn có thể cần phải thực thi tập lệnh python như sau:

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

tham chiếu cho autostart trong LXDE và tham chiếu để tạo python thực thi


Lưu ý rằng điều này sẽ không hoạt động nếu bạn không khởi động trong gui (ví dụ: chạy pi không đầu của bạn)
Havnar

0

những giải pháp này không hiệu quả đối với tôi khi cố gắng bắt đầu một kịch bản python bằng cách chạy Feh. Sau đây làm việc. Nó bắt đầu một kịch bản sau khi đăng nhập.

Mở một phiên cuối và chỉnh sửa tập tin

sudo nano /etc/profile

Thêm dòng sau vào cuối tập tin

/home/pi/your_script_name.sh

thay thế tên và đường dẫn của tập lệnh bằng tên và đường dẫn chính xác của tập lệnh khởi động của bạn. Lưu và thoát

Nhấn Ctrl + X để thoát trình soạn thảo nano theo sau là Y để lưu tệp.

Đây là những gì script.sh của tôi trông giống như:

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

Tôi nghĩ rằng tôi đã tạo cả tập lệnh script.sh và script.txt bằng cách sử dụng chmod

sudo chmod +x home/pi/your_script_name.sh
sudo chmod +x home/pi/your_python_script.py
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.