Python betiğini başlangıçta çalıştırma


29

Bu soru birkaç kez daha sorulmuştu ancak mevcut bilgileri kullanarak çalışmasını sağlayamadım.

Pi'm Raspbian'ı yönetiyor. Sonsuza dek döngüye dnscheck.py adlı bir Python betiği var.

Önyükleme sırasında koşmam gerekiyor. Gibi bir şey içeren bir .sh dosyası oluşturmak zorunda biliyorum

sudo python dnscheck.py &

Bilmediğim şey bu dosyanın nerede olması gerektiği veya başka bir şey içermesi gerektiğidir. İnit.d klasörünü biliyorum, ancak iskelet örneğini görünce bu basit görevi yapmanın daha basit bir yolu olması gerektiğini düşünüyorum.


gerçek bir kolay yol için adım adım öğretici ile ödeme -> youtu.be/Tvnrx-2QaUU istediğiniz kadar rampa yapın ve hepsini crontab'da adresleyin
Hossein RM

Yanıtlar:


20

Süreci, iskelet betiğini kullanarak başlatma, durdurma, yeniden başlatma vb. Gibi komutlarla kontrol etmek istiyorsanız ve bunu amaçlarınız için değiştirmek en iyi seçenek olabilir.

Sadece işlemin başlamasını istiyorsanız, komutu girin /etc/rc.local. (RPI'm elimde değil, ama çevrimiçi olarak orada 'çıkış 0' satırı olduğunu, emrinizi bu satırın üstüne koymanız gerektiğini okudum)


1
İşe yaradı! Senaryo için izinleri ayarlamalıyım ve rc.local 755'e geri dönmeli (okuma / yazma / yürütme) bir zorunluluktur. Her ikisinin de bu ayara ihtiyacı olup olmadığından emin değilim, ancak benim için çalıştı. Yardımın için çok teşekkürler!
Vlad Schnakovszki

7
"Sorunuzda yazdığınız gibi" Tam olarak değil - rc.localroot çalıştırdığı için sudo'ya ihtiyacınız yok . Açıkçası, komut dosyasının tam yolunu da belirtmelisiniz. Sonunda eklemelisiniz& ki böylelikle komut dosyası çatallanır /path/to/foobar.py &.
goldilocks

1
@goldilocks lütfen neden eklemek istediğimi açıklayabilir misiniz &? Çünkü onsuz kullandığımda her şey hala beklendiği gibi çalışıyor.
Huy.PhamNhu

2
@ Huy.PhamNhu Sorunuzu yanıtlama: Pi bu programı açılışta ve diğer hizmetler başlamadan önce çalıştıracak. Ve işareti eklemezseniz ve programınız sürekli çalışıyorsa, Pi açılış işlemini tamamlamaz. Ve işareti, komutun ayrı bir işlemde çalışmasını ve çalışan ana işlemle önyüklemeye devam etmesini sağlar.
Amine Harbaoui,

6

Komut dosyanızı (dosyaya kaydedeceğiz dnscheck) adresine taşıyın /etc/init.d/ve izinleri çalışacak şekilde ayarlayın:

chmod 755 /etc/init.d/dnscheck

Komut dosyanızın üstüne LSB init etiketleri ekleyin . Muhtemelen, Zorunlu Başlatma / Durdurma ve Açıklama Etiketlerini komut dosyasına uyacak şekilde değiştirmek isteyeceksiniz.

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

Ardından, sembolik bağları çalıştırarak oluşturun.

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

2
Lütfen değil bu 1/2 yıl önce iyi bir cevap 3. oldu ve süre o olacak hala iş Raspbian yeni init sistemi ile uyumludur, çünkü LSB / SysV tarzı komut, yeni kullanıcılar daha iyi yerine yeni bir sistem kullanmayı öğrenerek kapalı olacağını ( systemd ) sadece bir satır eklemek /etc/rc.localyetersizdir.
goldilocks

3

Elbette bunu yapmanın birçok yolu var, ama kullanmayı unutma cron. @rebootCrontab'ınıza bir çizgi koyarsanız , bu komut her yeniden çalıştırmada çalıştırılır.

Sınamak için, aşağıdaki satırı kullanıcı crontab'ımla birlikte ekledim crontab -e: @reboot echo "$(date)" >> ~/boot.txt Bu yöntemin bonusu, işi yalnızca önyükleme zamanının yanı sıra diğer aralıklarla gerektiği gibi çağırabileceğiniz ve init komut dosyalarını düzenlemek zorunda olmadığınızdır.


3

rc.local dosyasını kullanırsanız, sorun giderme için yardımcı olabilir. Günlük dosyasına hatalara (stderr) ve komut çıkışına (stdout) kayıt satırları ekleyebilirsiniz. Bu örneğe göre, bu dosya /tmp/rc.local.log dosyasına kaydeder.

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

DAHA FAZLASI


3

Gerçekten de şaşırdım djb'nin daemontools burada belirtilmez. Daemontools uygun işlem denetlemesi yapar ve otomatik döndürülmüş günlük tutma gibi harika özellikler ekleyebilirsiniz. TL; DR Bunlardan herhangi birine aşina değilseniz, işleminiz her başarısız olduğunda yeniden başlatılır ve Pi açıldığında otomatik olarak başlar. Başarısızlık modlarına sahip kötü bir python programı yazdıysanız ancak bir hatayla karşılaşıldığında ölmesini istemiyorsanız, bu harika bir şey.

yükleyin:

sudo apt-get install daemontools daemontools-run

Ardından daemonize süreçler oluşturmak için adımları izleyin:

Bir runbetiği /etc/service/<my_custom_service_name>baska bir perk'e kopyalamak kadar basittir : herhangi bir kullanıcı veya root olarak kullanabilirsiniz! Bağlantıdaki detaylar.

FWIW 3 farklı python işlemim olan bir Pi projem vardı (her biri CPU zamanı kullanan bir yürütme döngüsüne sahipti, bu yüzden 3 işlem kullanarak her işlemin 1 CPU çekirdeğinden yararlanmasına izin verdim). Daemontools, Pi'nin fişini taktıktan sonra üçünün de otomatik olarak çalışmasını ve çalışmaya devam etmesini sağlamamı sağladı.


basit ve kolay bir çözüm, cevap çok zaman kazandırdı, teşekkürler ..
ShivaGuntuku 18

2

İşte sürekli kullandığım çözüm.

Bir masaüstü dosyası oluşturun

xyz.desktop

aşağıdakini yazı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

bu dosyayı içine yapıştırın

/home/pi/.config/autostart/

ahududu pi'nizi yeniden başlatın ve otomatik olarak programınızı yeni bir terminalde çalıştırmalıdır.


lütfen cevapları kesmeyin ve birden fazla soruya yapıştırmayın. Cevap aynıysa, yeni sürüm kopya olarak işaretlenmelidir.
Steve Robillard

Bunu yapmamamın tek nedeni, bu sayfanın diğerine nazaran daha fazla görüşe sahip olmasıdır.
evolutionizer

@SteveRobillard Ben de temsilcisi bunu yapmak için gerekli olduğunu düşünüyorum daha dont
evolutionizer

Bir gönderiyi işaretlemek sadece 15 rep alır. Bu konuda ne yapılması gerektiğine karar vermek, moderatörlerin işidir - bu nedenle görüş sayısı önemsizdir. Çift cevaplar sistem tarafından otomatik olarak işaretlenir. Sistemin bir oyun şekli. Bu nedenle, üçünü sildim.
Steve Robillard,

@SteveRobillard Bilgi için teşekkürler ve cehaletimi affedin. Orada önceki soruyu çift olarak işaretledim.
evolutionizer

2

Bir .py dosyasını kullanmak için, sadece dosyayı #!/usr/bin/pythonen başında satırına koyun . Sonra çalıştırılabilir hale getirin chmod +x filename. Sonra, satırı ekleyin /path/to/file.py &için /etc/rc.localönce exit 0hat (takas /path/to/file.pyBetiğinize yolu ile). Bu, python komut dosyanızın önyükleme sonunda çalıştırılmasını sağlar.


0

İşte benim için işe yarayan daha kolay bir yöntem. Otomatik başlatmayı LXDE'de değiştirin.

Bir terminal açın ve autostart dosyasını aşağıdaki gibi düzenleyin:

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

aşağıya aşağıdaki metin satırını ekleyin (example.py'nizin bulunduğu yere giden yolu değiştirin)

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

ctr-x ve kaydet. Python betiğini aşağıdaki gibi çalıştırılabilir hale getirmeniz gerekebilir:

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

LXDE'de autostart için başvuru ve python'un çalıştırılabilir hale getirilmesi için başvuru


Bir
gui'ye

0

bu çözümler benim için Feh ile çalışan bir python betiği başlatmaya çalışırken işe yaramadı. Aşağıdaki çalıştı. Giriş yaptıktan sonra bir betiği başlatır.

Bir terminal oturumu açın ve dosyayı düzenleyin

sudo nano /etc/profile

Dosyanın sonuna aşağıdaki satırı ekleyin

/home/pi/your_script_name.sh

komut dosyasının adını ve yolunu, başlangıç ​​komut dosyanızın doğru adı ve yoluyla değiştirin. Kaydet ve çık

Nano editörden çıkmak için Ctrl + X tuşlarına, ardından dosyayı kaydetmek için Y tuşuna basın.

İşte benim script.sh nasıl görünüyordu:

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

Ben chmod kullanarak hem script.sh hem de script.py çalıştırılabilir yaptığını düşünüyorum

sudo chmod +x home/pi/your_script_name.sh
sudo chmod +x home/pi/your_python_script.py
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.