這個問題已經問了好幾次了,但是我似乎並沒有使用現有的信息來解決這個問題。
我的Pi運行Raspbian。我有一個名為dnscheck.py的Python腳本,它將永遠循環。
我需要它在啟動時運行。我知道我必須創建一個包含類似
sudo python dnscheck.py &
之類的.sh文件,我不知道該文件在哪裡應該是或者是否應該包含其他任何內容。我知道init.d文件夾,但是看到框架示例,我想應該有一種更簡單的方法來完成此簡單任務。
這個問題已經問了好幾次了,但是我似乎並沒有使用現有的信息來解決這個問題。
我的Pi運行Raspbian。我有一個名為dnscheck.py的Python腳本,它將永遠循環。
我需要它在啟動時運行。我知道我必須創建一個包含類似
sudo python dnscheck.py &
之類的.sh文件,我不知道該文件在哪裡應該是或者是否應該包含其他任何內容。我知道init.d文件夾,但是看到框架示例,我想應該有一種更簡單的方法來完成此簡單任務。
如果您要使用骨架腳本通過啟動,停止,重新啟動等命令控制流程,並根據自己的目的進行更改,則可能是最佳選擇。 ,將命令放入 /etc/rc.local
中。 (我手頭沒有我的RPi,但我在線閱讀有一個“ exit 0”行,您應該將命令放在此行上方)
將您的腳本(我們將其保存到文件 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默認值
創建符號鏈接
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
當然,有很多方法可以做到這一點,但不要忘記使用 cron
。如果在crontab中放入 @reboot
行,則該命令將在每次重新啟動時執行。
要進行測試,我只是使用 crontab -e
: @reboot echo“ $(date)” >>〜/ boot.txt
此方法的好處是您可以按需要在其他時間間隔調用作業,而不僅僅是啟動時間,您不必編輯初始化腳本。
如果使用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 更多
我真的很驚訝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個組件都能自動運行並保持運行狀態。
要使用.py文件,只需在文件的開頭放置#!/ usr / bin / python
行。然後使用 chmod + x filename
使其可執行。接下來,將 /path/to/file.py &
行添加到 exit 0
行之前的 /etc/rc.local
中(交換 /path/to/file.py
以及腳本路徑)。這將使您的python腳本在啟動結束時執行。
這是我經常使用的解決方案。
創建桌面文件
xyz.desktop
鍵入以下內容
[桌麵條目] Encoding = UTF-8Type = ApplicationName = <應用程序名稱轉到此處>Comment = Exec = python /home/pi/Desktop/execute_on_boot.pyStartupNotify=falseTerminal=trueHidden=false
將此文件粘貼到
/home/pi/.config/autostart /
,然後重新啟動樹莓派它將自動在新終端中運行您的程序
這些解決方案對我嘗試通過運行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
這是對我有用的更簡單的方法。修改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