Menjalankan skrip Python saat startup

29

Pertanyaan ini telah ditanyakan beberapa kali sebelumnya, tetapi sepertinya saya tidak membuatnya bekerja menggunakan informasi yang ada.

Pi saya menjalankan Raspbian. Saya memiliki skrip Python bernama dnscheck.py yang berulang selamanya.

Saya perlu menjalankannya saat boot. Saya tahu saya harus membuat file .sh yang berisi sesuatu seperti

sudo python dnscheck.py &

Apa yang saya tidak tahu adalah di mana file ini seharusnya atau apakah itu harus mengandung yang lain. Saya tahu tentang folder init.d, tetapi melihat contoh kerangka yang saya bayangkan seharusnya ada cara yang lebih sederhana untuk melakukan tugas sederhana ini.

Vlad Schnakovszki
sumber
untuk cara mudah yang sebenarnya, checkout tutorial langkah demi langkah ini -> youtu.be/Tvnrx-2QaUU membuat launcher sebanyak yang Anda butuhkan dan beri alamat semuanya di crontab
Hossein RM

Jawaban:

20

Jika Anda ingin mengontrol proses dengan perintah seperti start, stop, restart dll menggunakan skeleton skrip dan ubah untuk tujuan Anda mungkin merupakan opsi terbaik.

Jika Anda hanya ingin memulai proses, masukkan perintah /etc/rc.local. (Saya tidak punya RPi di tangan, tetapi saya membaca secara online bahwa ada garis 'keluar 0' di sana, Anda harus meletakkan perintah Anda di atas garis ini)

ikku
sumber
1
Berhasil! Saya harus menambahkan bahwa pengaturan izin untuk skrip dan rc.local kembali ke 755 (baca / tulis / eksekusi) adalah suatu keharusan. Tidak yakin apakah keduanya memerlukan pengaturan ini, tetapi itu berhasil untuk saya. Terima kasih banyak atas bantuannya!
Vlad Schnakovszki
7
"Seperti yang Anda tulis dalam pertanyaan Anda" Tidak cukup - Anda tidak perlu sudo sebagai rc.localroot. Anda juga harus menentukan path lengkap ke skrip. Anda juga harus menambahkan& di bagian akhir sehingga skrip memotong, misalnya /path/to/foobar.py &.
goldilocks
1
@goldilocks dapatkah Anda menjelaskan mengapa saya perlu menambahkan &? Karena ketika saya gunakan tanpanya, semuanya tetap berfungsi seperti yang diharapkan.
Huy.PhamNhu
2
@ Huy.PhamNhu Menjawab pertanyaan Anda: Pi akan menjalankan program ini saat bootup, dan sebelum layanan lain dimulai. Jika Anda tidak menyertakan ampersand dan jika program Anda berjalan terus menerus, Pi tidak akan menyelesaikan proses bootnya. Ampersand memungkinkan perintah untuk berjalan dalam proses terpisah dan melanjutkan boot dengan proses utama berjalan.
Amine Harbaoui
6

Pindahkan skrip Anda (kami akan menyimpannya ke file dnscheck) ke /etc/init.d/, dan atur izin agar dapat dijalankan:

chmod 755 /etc/init.d/dnscheck

Tambahkan tag init LSB ke bagian atas skrip Anda. Anda mungkin ingin mengubah Diperlukan-Mulai / Berhenti dan Tag Deskripsi agar sesuai skrip Anda.

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

Kemudian buat tautan simbolik dengan menjalankan

update-rc.d /etc/init.d/dnscheck defaults
Bert
sumber
2
Tolong jangan bahwa sementara ini adalah jawaban yang layak 3 1/2 tahun yang lalu, dan masih akan bekerja karena sistem init baru Raspbian ini kompatibel dengan skrip gaya LSB / SysV, pengguna baru akan lebih baik belajar menggunakan sistem baru sebagai gantinya ( systemd ) jika hanya menambahkan baris ke /etc/rc.localtidak cukup.
goldilocks
3

Ada banyak cara untuk melakukan ini, tentu saja, tetapi jangan lupa gunakan cron. Jika Anda meletakkan @rebootbaris di crontab Anda, perintah itu akan dieksekusi pada setiap restart.

Untuk mengujinya, saya baru saja menambahkan baris berikut ke crontab pengguna saya dengan crontab -e: @reboot echo "$(date)" >> ~/boot.txt Bonus untuk metode ini adalah Anda dapat memanggil pekerjaan seperti yang diminta pada interval lain selain waktu boot, dan Anda tidak perlu mengedit skrip init.

bobstro
sumber
3

jika Anda menggunakan file rc.local, ini mungkin berguna untuk pemecahan masalah. Anda dapat menambahkan baris logging ke kesalahan log (stderr) dan output perintah (stdout) ke file log. Menurut contoh ini file tersebut disimpan di /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

Baca lebih lanjut

Tharanga
sumber
3

Saya benar-benar terkejut bahwa daemontools DJJ tidak disebutkan di sini. Daemontools melakukan pengawasan proses yang tepat dan Anda dapat menambahkan fitur keren seperti logging yang diputar secara otomatis. TL; DR jika Anda tidak terbiasa dengan semua ini, proses Anda akan dimulai kembali setiap kali gagal dan mulai secara otomatis ketika Pi Anda menyala. Ini bagus jika Anda menulis program python yang buruk yang memiliki mode kegagalan tetapi Anda tidak ingin hanya mati jika terjadi kesalahan.

Memasang:

sudo apt-get install daemontools daemontools-run

Kemudian ikuti langkah-langkah untuk membuat proses yang di-daemonisasi:

Ini sebagian besar sesederhana menyalin runskrip ke /etc/service/<my_custom_service_name>merembes lain: Anda dapat berjalan sebagai pengguna atau root! Detail dalam tautan.

FWIW Saya memiliki proyek Pi di mana saya memiliki 3 proses python berbeda (masing-masing memiliki loop eksekusi menggunakan waktu CPU sehingga dengan menggunakan 3 proses saya memungkinkan setiap proses untuk memanfaatkan 1 inti CPU). Daemontools memungkinkan saya untuk memastikan ketiga secara otomatis akan berjalan dan tetap berjalan setelah saya terhubung dengan Pi.

Sam
sumber
solusi sederhana dan mudah, jawaban Anda menghemat banyak waktu, terima kasih ..
ShivaGuntuku
2

Inilah solusi yang saya gunakan secara konstan.

Buat file desktop

xyz.desktop

ketik berikut ini ke dalamnya

[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

rekatkan file ini ke dalam

/home/pi/.config/autostart/

dan restart pi raspberry Anda dan itu akan secara otomatis menjalankan program Anda di terminal baru

evolusionis
sumber
tolong jangan potong dan tempel jawaban untuk beberapa pertanyaan. Jika jawabannya sama, versi yang lebih baru harus ditandai sebagai duplikat.
Steve Robillard
Satu-satunya alasan saya tidak melakukannya adalah karena halaman ini memiliki jumlah tampilan yang lebih besar dibandingkan dengan yang lain.
evolusionis
@SteveRobillard Saya juga tidak berpikir saya memiliki perwakilan yang diperlukan untuk melakukannya
evolusionis
Memberi tanda pada sebuah posting hanya membutuhkan 15 rep. Memutuskan apa yang harus dilakukan tentang hal itu adalah tugas moderator - sehingga jumlah pandangan tidak relevan. Jawaban duplikat secara otomatis ditandai oleh sistem. Mereka adalah bentuk permainan sistem. Karena itu, saya menghapus yang ketiga.
Steve Robillard
@SteveRobillard Terima kasih atas informasinya dan maafkan ketidaktahuan saya. Saya sudah ada di sana untuk menandai pertanyaan sebelumnya sebagai duplikat.
evolusionis
2

Untuk menggunakan file .py, cukup letakkan baris #!/usr/bin/pythondi bagian paling awal file Anda. Kemudian membuatnya bisa dieksekusi dengan chmod +x filename. Selanjutnya, tambahkan baris /path/to/file.py &ke /etc/rc.localsebelum exit 0baris (bertukar /path/to/file.pydengan path ke skrip Anda). Ini akan membuat skrip python Anda mengeksekusi di akhir boot.

Theoremiser
sumber
0

Inilah metode yang bahkan lebih mudah untuk saya. Ubah autostart di LXDE.

Buka terminal dan edit file autostart sebagai berikut:

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

tambahkan baris teks berikut ke bawah (ubah jalur seperlunya ke tempat example.py Anda berada)

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

ctr-x, dan simpan. Anda mungkin perlu membuat skrip python dieksekusi sebagai berikut:

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

referensi untuk autostart di LXDE dan referensi untuk membuat python dieksekusi

hidronik
sumber
Perhatikan bahwa ini tidak akan berhasil jika Anda tidak memulai dalam gui (yaitu: jalankan pi Anda tanpa kepala)
Havnar
0

solusi ini tidak berhasil untuk saya mencoba memulai skrip python dengan menjalankan Feh. Berikut ini berhasil. Ini memulai skrip setelah login.

Buka sesi terminal dan edit file

sudo nano /etc/profile

Tambahkan baris berikut ke akhir file

/home/pi/your_script_name.sh

ganti nama skrip dan jalur dengan nama dan jalur skrip start-up yang benar. Simpan dan keluar

Tekan Ctrl + X untuk keluar dari editor nano diikuti oleh Y untuk menyimpan file.

Begini tampilannya script.sh saya:

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

Saya pikir saya membuat script.sh dan script.py dieksekusi menggunakan chmod

sudo chmod +x home/pi/your_script_name.sh
sudo chmod +x home/pi/your_python_script.py
hidronik
sumber