題:
在啟動時運行Python腳本
Vlad Schnakovszki
2012-12-27 00:06:19 UTC
view on stackexchange narkive permalink

這個問題已經問了好幾次了,但是我似乎並沒有使用現有的信息來解決這個問題。

我的Pi運行Raspbian。我有一個名為dnscheck.py的Python腳本,它將永遠循環。

我需要它在啟動時運行。我知道我必須創建一個包含類似

  sudo python dnscheck.py &  

之類的.sh文件,我不知道該文件在哪裡應該是或者是否應該包含其他任何內容。我知道init.d文件夾,但是看到框架示例,我想應該有一種更簡單的方法來完成此簡單任務。

一個真正簡單的方法,請查看此分步教程-> https://youtu.be/Tvnrx-2QaUU根據需要製作盡可能多的啟動器,並在crontab中處理所有啟動器
十 答案:
ikku
2012-12-27 02:42:40 UTC
view on stackexchange narkive permalink

如果您要使用骨架腳本通過啟動,停止,重新啟動等命令控制流程,並根據自己的目的進行更改,則可能是最佳選擇。 ,將命令放入 /etc/rc.local 中。 (我手頭沒有我的RPi,但我在線閱讀有一個“ exit 0”行,您應該將命令放在此行上方)

有效!我必須添加將腳本和rc.local的權限設置回755(讀/寫/執行)的必要條件。不知道兩者是否都需要此設置,但對我有用。非常感謝您的幫助!
*“正如您在問題中所寫的” **不完全-您不需要sudo,因為rc.local運行root。顯然,您還應該指定腳本的完整路徑。 **您還應該在末尾添加`&`**,以便腳本派生,例如`/path/to/foobar.py&`。
@goldilocks您能否解釋為什麼我需要添加`&`嗎?因為當我不使用它時,一切仍然按預期運行。
@Huy.PhamNhu回答您的問題:Pi將在啟動時以及其他服務啟動之前運行該程序。如果您不包括與號,並且您的程序連續運行,則Pi將無法完成啟動過程。 &符允許命令在單獨的進程中運行,並在主進程運行時繼續引導。
Bert
2012-12-27 00:55:34 UTC
view on stackexchange narkive permalink

將您的腳本(我們將其保存到文件 dnscheck 中)移動到 /etc/init.d / ,並設置權限以使其可以運行:

  chmod 755 /etc/init.d/dnscheck 

在腳本頂部添加 LSB初始化標籤。您可能需要更改Required-Start / Stop和Description標籤以適合您的腳本。

  ### BEGIN INIT INFO#提供:dnscheck#Required-Start:$ remote_fs $ syslog#必需的停止:$ remote_fs $ syslog#默認的開始:2 3 4 5#默認的停止:0 1 6#簡短描述:在啟動時啟動守護程序#描述:啟用守護程序提供的服務。### END INIT INFO  

然後通過運行

  update-rc.d /etc/init.d/dnscheck默認值 
創建符號鏈接
請不要在3 1/2年前這是一個不錯的答案的同時,由於Raspbian的新init系統與LSB / SysV樣式腳本向後兼容仍然可以使用,但是新用戶最好還是學習使用新系統(* systemd *)如果僅在`/ etc / rc.local`中添加一行是不夠的。
Ingo
2020-03-24 14:42:09 UTC
view on stackexchange narkive permalink

2020更新:
如今,包括Raspbian在內的現代Linux發行版都使用 systemd 代替舊版本的 SysV 作為初始化系統。為了實現下游兼容性, SysV 僅由 systemd 模擬,但是隨著時間的流逝,它會失去越來越多的支持,因此

您不應再使用SysV,尤其是 /etc/rc.local

有關此的更多信息,請參見與SysV的兼容性

隨著腳本中的無限循環,它應該作為服務在後台運行,因此您可以使用通過Unit文件定義的systemd服務。這是您的腳本的一個簡單示例。使用以下命令創建它:

  rpi〜$ sudo systemctl --force --full edit dnscheck.service  

在空編輯器中插入以下語句,保存它們並退出編輯器:

  [Unit] Description =檢查DNS查詢After = multi-user.target [Service] ExecStart = / usr / bin / python3 /home/pi/dnscheck.py [安裝] WantedBy = multi-user.target  

這可能太簡單了,您必須為所需的環境添加更多設置。請查看 man systemd.unit man systemd.service 以獲得其他條件。

啟用並監視服務的方法如下:

  rpi〜$ sudo systemctl enable --now dnscheck.servicerpi〜$ systemctl status dnscheck.service  

您將在日誌中找到腳本的文本輸出:

  rpi〜$ journalctl -b -e  
這個“答案”已經晚了8年!為什麼要復活死者?
@Milliways您不了解第一行:** 2020更新:**? 2020年是2020年。
您定期建議其他人接受答案,以停止無用的問題重新出現-但這就是您的“答案”將要實現的所有事情就是使死者復活。否則,這個人本可以安全地留在墳墓中。
你把這個問題留在墳墓裡是錯誤的。 [在其他問題上作為重複的答案被引用](https://raspberrypi.stackexchange.com/q/108694/79866)。因此,我認為保持最新狀態非常重要,這樣OP才能不遵循其他已過時的舊東西。這就是我更新它的原因。
@Milliways忘記引用您。請注意我上面的評論。
bobstro
2015-08-26 00:34:22 UTC
view on stackexchange narkive permalink

當然,有很多方法可以做到這一點,但不要忘記使用 cron 。如果在crontab中放入 @reboot 行,則該命令將在每次重新啟動時執行。

要進行測試,我只是使用 crontab -e @reboot echo“ $(date)” >>〜/ boot.txt 此方法的好處是您可以按需要在其他時間間隔調用作業,而不僅僅是啟動時間,您不必編輯初始化腳本。

Tharanga
2017-05-17 21:05:35 UTC
view on stackexchange narkive permalink

如果使用rc.local文件,這可能有助於故障排除。您可以添加日誌記錄行以將錯誤(stderr)和命令輸出(stdout)記錄到日誌文件中。根據此示例,文件保存在/tmp/rc.local.log

#!/bin/sh -e ## rc.local ##中。此腳本在每個多用戶的末尾執行#確保要成功啟用或禁用此腳本,只需更改執行#位即可。##默認情況下,此腳本不執行任何操作。 2> /tmp/rc.local.log#將stderr從rc.local發送到日誌文件exec 1>&2#將stdout發送到同一日誌文件#您的其他命令...退出0  

Read 更多

Sam
2018-01-14 02:07:43 UTC
view on stackexchange narkive permalink

我真的很驚訝djb的 daemontools在這裡沒有提到。 Daemontools會進行適當的過程監控,您可以添加一些很酷的功能,例如自動旋轉的日誌記錄。 TL; DR如果您不熟悉其中的任何一個,則每次失敗時都會重新啟動過程,並在打開Pi時自動啟動。如果您編寫了一個錯誤的具有失敗模式的python程序,但是您不希望它僅在遇到錯誤時就死掉,那就太好了。

安裝:

sudo apt-get install daemontools daemontools-run

然後按照以下步驟創建守護進程:

最簡單的方法就是將 run 腳本複製到 / etc / service中/ <my_custom_service_name> 另一個好處是:您可以以任何用戶或root身份運行!鏈接中的詳細信息。

FWIW,我有一個Pi項目,其中有3個不同的python進程(每個進程都有一個使用CPU時間的執行循環,因此通過使用3個進程,我允許每個進程利用1個CPU內核)。通過Daemontools,我可以確保在插入Pi後,這3個組件都能自動運行並保持運行狀態。

簡單易用的解決方案,您的答案節省了很多時間,謝謝..
Will Dereham
2015-05-25 20:47:57 UTC
view on stackexchange narkive permalink

要使用.py文件,只需在文件的開頭放置#!/ usr / bin / python 行。然後使用 chmod + x filename 使其可執行。接下來,將 /path/to/file.py & 行添加到 exit 0 行之前的 /etc/rc.local 中(交換 /path/to/file.py 以及腳本路徑)。這將使您的python腳本在啟動結束時執行。

evolutionizer
2015-08-26 00:07:52 UTC
view on stackexchange narkive permalink

這是我經常使用的解決方案。

創建桌面文件

  xyz.desktop  

鍵入以下內容

  [桌麵條目] Encoding = UTF-8Type = ApplicationName = <應用程序名稱轉到此處>Comment = Exec = python /home/pi/Desktop/execute_on_boot.pyStartupNotify=falseTerminal=trueHidden=false 

將此文件粘貼到

  /home/pi/.config/autostart /  

,然後重新啟動樹莓派它將自動在新終端中運行您的程序

請不要剪切並粘貼多個問題的答案。如果答案相同,則應將較新的版本標記為重複。
我沒有這樣做的唯一原因是導致此頁面具有比其他頁面更大的視圖數量。
@SteveRobillard我也不認為我需要這樣做
標記信息僅需15次。決定該怎麼做是主持人的工作-因此視圖的數量無關緊要。系統會自動標記重複的答案。它們是遊戲系統的一種形式。因此,我刪除了第三個。
-1
hydronics
2016-03-09 05:21:41 UTC
view on stackexchange narkive permalink

這些解決方案對我嘗試通過運行Feh啟動python腳本不起作用。以下工作。登錄後啟動腳本。

打開終端會話並編輯文件

sudo nano / etc / profile

將以下行添加到文件

/home/pi/your_script_name.sh

用正確的啟動腳本名稱和路徑替換腳本名稱和路徑。保存並退出

按Ctrl + X退出nano編輯器,然後按Y保存文件。

這是我的script.sh外觀:

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

我想我同時製作了兩個腳本使用chmod的.sh和script.py可執行文件

  sudo chmod + x home / pi / your_script_name.shsudo chmod + x home / pi / your_python_script.py  
hydronics
2016-03-09 11:25:12 UTC
view on stackexchange narkive permalink

這是對我有用的更簡單的方法。修改LXDE中的自動啟動。

打開終端並按如下所示編輯自動啟動文件:

  sudo nano /home/pi/.config/lxsession/LXDE-pi/自動啟動 

將以下文本行添加到底部(根據需要修改example.py所在的路徑)

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

ctr-x,然後保存。您可能需要使python腳本可執行如下:

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

reference用於在LXDE中自動啟動,而引用用於使python可執行

請注意,如果您不以gui身份啟動,則此操作將無效(例如:無頭運行pi)


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...