起動時にPythonスクリプトを実行する


29

この質問は以前にも何度も質問されてきましたが、既存の情報を使用して機能するようには思われませんでした。

私のPiはRaspbianを実行しています。永久にループするdnscheck.pyというPythonスクリプトがあります。

起動時に実行する必要があります。私は次のようなものを含む.shファイルを作成する必要があることを知っています

sudo python dnscheck.py &

私が知らないのは、このファイルがどこにあるべきか、それが何か他のものを含むべきかどうかです。init.dフォルダーについては知っていますが、スケルトンの例を見ると、この単純なタスクを行うためのもっと簡単な方法があるはずだと思います。


実際の簡単な方法については、このステップバイステップのチュートリアルをチェックしてください-> youtu.be/Tvnrx-2QaUUは必要なだけランチャーを作成し、それらをすべてcrontabでアドレス指定します
Hossein RM

回答:


20

スケルトンスクリプトを使用して開始、停止、再起動などのコマンドを使用してプロセスを制御し、目的に合わせて変更するのが最適なオプションです。

プロセスを開始するだけの場合は、コマンドをに入れ/etc/rc.localます。(RPiを手元に持っていませんが、そこに「exit 0」行があることをオンラインで読みます。この行の上にコマンドを置く必要があります)


1
出来た!スクリプトとrc.localのアクセス許可を755(読み取り/書き込み/実行)に戻す必要があることを追加する必要があります。両方にこの設定が必要かどうかはわかりませんが、私にとってはうまくいきました。助けてくれてありがとう!
Vlad Schnakovszki

7
「質問で書いたように」まったくそうではありません- rc.local実行ルートとしてsudoは必要ありません。もちろん、スクリプトへの完全なパスも指定する必要があります。 また&、スクリプトが分岐するように最後に追加する必要があり/path/to/foobar.py &ます。
goldilocks

1
@goldilocksでは、なぜ追加する必要があるのか​​説明してください&。なぜなら、私がそれなしで使用すると、すべてが期待どおりに機能するからです。
Huy.PhamNhu

2
@ Huy.PhamNhuあなたの質問に答える:Piは起動時に、他のサービスが開始される前にこのプログラムを実行します。アンパサンドを含めず、プログラムが継続的に実行される場合、Piはブートプロセスを完了しません。アンパサンドを使用すると、コマンドを別のプロセスで実行し、メインプロセスを実行したまま起動を続けることができます。
アミンHarbaoui

6

スクリプトを(ファイルに保存しますdnscheck)に移動し/etc/init.d/、実行できるようにアクセス許可を設定します。

chmod 755 /etc/init.d/dnscheck

スクリプトの先頭にLSB initタグを追加します。おそらく、スクリプトに合わせてRequired-Start / StopとDescriptionタグを変更する必要があります。

### 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年半前にはまともな回答でしたが、Raspbianの新しいinitシステムはLSB / SysVスタイルのスクリプトと下位互換性があるため、引き続き機能しますが、新しいユーザーは代わりに新しいシステムを使用することを学習した方がよいことに注意してください(systemd)行を追加するだけで/etc/rc.localは不十分な場合。
goldilocks

3

もちろん、これを行うには多くの方法がありますが、の使用を忘れないでくださいcron。あなたが入れた場合は@reboot、あなたのcrontabにラインを、そのコマンドは、すべての再起動時に実行されます。

テストするために、ユーザーcrontabに次の行を追加しましたcrontab -e @reboot echo "$(date)" >> ~/boot.txt この方法の利点は、起動時だけでなく他の間隔で必要に応じてジョブを呼び出すことができ、initスクリプトを編集する必要がないことです。


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

djbのdaemontoolsがここで言及されていないことに本当に驚いています。Daemontoolsは適切なプロセス監視を行い、自動ローテーションロギングなどのクールな機能を追加できます。TL; DRこのいずれにも慣れていない場合、プロセスは失敗するたびに再起動され、Piがオンになると自動的に開始されます。これは、失敗モードのある悪いpythonプログラムを書いたが、エラーが発生した場合に死にたくない場合に最適です。

インストール:

sudo apt-get install daemontools daemontools-run

次に、デーモン化されたプロセスを作成する手順に従います。

ほとんどの場合、runスクリプトを/etc/service/<my_custom_service_name>別の特典にコピーするのと同じくらい簡単です。任意のユーザーまたはルートとして実行できます。リンクの詳細。

FWIW私は3つの異なるpythonプロセスがあるPiプロジェクトを持っていました(それぞれにCPU時間を使用する実行ループがあったため、3つのプロセスを使用することで各プロセスが1つのCPUコアを活用できました)。Daemontoolsを使用すると、Piを接続した後、3つすべてが自動的に実行され、実行したままになることを確認できました。


シンプルで簡単なソリューション、あなたのいる答え保存した多くの多くの時間、ありがとう...
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/

ラズベリーパイを再起動すると、新しいターミナルでプログラムが自動的に実行されます


複数の質問への回答をカットアンドペーストしないでください。答えが同じ場合は、新しいバージョンに重複のフラグを立てる必要があります。
スティーブロビラード

私がそれをしなかった唯一の理由は、このページが他のページとは対照的に、より多くのビューを持っていたからです。
進化論者

@SteveRobillard私もそうするために必要な担当者がいるとは思わない
進化論者

投稿にフラグを立てるのに必要なのは15人だけです。それについて何をするかを決めるのは、モデレーターの仕事です。したがって、ビューの数は無関係です。重複した回答には、システムによって自動的にフラグが立てられます。それらはシステムを賭ける形です。したがって、3番目のものを削除しました。
スティーブロビラード

@SteveRobillard情報をありがとう、私の無知を許してください。前の質問に重複のフラグを立てました。
進化論者

2

.pyファイルを使用するに#!/usr/bin/pythonは、ファイルの最初に行を追加します。次に、で実行可能にしchmod +x filenameます。次に、行の前に行/path/to/file.py &を追加します(スクリプトへのパスと交換します)。これにより、起動終了時にpythonスクリプトが実行されます。/etc/rc.localexit 0/path/to/file.py


0

ここで私のために働いたさらに簡単な方法があります。LXDEの自動起動を変更します。

ターミナルを開き、次のように自動起動ファイルを編集します。

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とで自動起動のための参照 Pythonの実行ファイルを作成するため


guiで起動しない場合(つまり、piをヘッドレスで実行する場合)
Havnar

0

Fehを実行してpythonスクリプトを開始しようとしても、これらのソリューションは機能しませんでした。以下が働いた。ログイン後にスクリプトを開始します。

ターミナルセッションを開き、ファイルを編集します

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 /

chmodを使用してscript.shとscript.pyの両方を実行可能にしたと思います

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.