ラップトップをウェイクアップするsystemdサービスファイルとタイマーファイルがあり、pythonスクリプトを実行する必要があります。その後、それが完了すると、bashスクリプトを実行して一時停止に戻します。現在、ラップトップをウェイクアップします、しばらくしてから一時停止します。エラーが発生する理由がわかりません。pythonスクリプトを手動で実行すると、コマンドラインから正常に機能します。タイマーとサービスの両方のステータスが含まれます。
環境:
WXFORECAST_PUSHOVER_APP_KEY=randomAPPKey
WXFORECAST_COORDINATES=31.02,-90.56
PUSHOVER_DEVICE=weather
PUSHOVER_USER_KEY=randomGroupKey
ステータスサービス
● wxforecast.service - Send Weather Update
Loaded: loaded (/etc/systemd/system/wxforecast.service; static; vendor preset: enabled)
Active: failed (Result: exit-code) since Fri 2020-05-29 07:00:24 CDT; 3h 56min ago
Process: 31417 ExecStopPost=/bin/bash /usr/local/bin/sus.sh (code=exited, status=0/SUCCESS)
Process: 31287 ExecStart=/usr/bin/python3 /home/william/CODE/wxforecast/wxforecast.py (code=exited, status=1/FAILURE)
Main PID: 31287 (code=exited, status=1/FAILURE)
May 29 07:00:24 william python3[31287]: File "/usr/local/lib/python3.6/dist-packages/requests/sessions.py", line 646, in send
May 29 07:00:24 william python3[31287]: r = adapter.send(request, **kwargs)
May 29 07:00:24 william python3[31287]: File "/usr/local/lib/python3.6/dist-packages/requests/adapters.py", line 516, in send
May 29 07:00:24 william python3[31287]: raise ConnectionError(e, request=request)
May 29 07:00:24 william python3[31287]: requests.exceptions.ConnectionError: HTTPSConnectionPool(Host='api.weather.gov', port=443): Max retries exceeded with url: /points/35.0
May 29 07:00:24 william systemd[1]: wxforecast.service: Main process exited, code=exited, status=1/FAILURE
May 29 07:00:24 william Sudo[31424]: root : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/bin/systemctl suspend
May 29 07:00:24 william Sudo[31424]: pam_unix(Sudo:session): session opened for user root by (uid=0)
May 29 07:00:24 william Sudo[31424]: pam_unix(Sudo:session): session closed for user root
May 29 07:00:24 william systemd[1]: wxforecast.service: Failed with result 'exit-code'.
ステータスタイマー
● wxforecast.timer - Send Weather Update
Loaded: loaded (/etc/systemd/system/wxforecast.timer; enabled; vendor preset: enabled)
Active: active (waiting) since Sun 2020-05-24 18:33:02 CDT; 4 days ago
Trigger: Sat 2020-05-30 07:00:00 CDT; 20h left
sus.sh
/usr/bin/Sudo /bin/systemctl suspend
wxforecast.py
## https://github.com/stacybrock/wxforecast
import os
import nwswx
import requests
(LAT, LON) = [c.strip() for c in os.getenv('WXFORECAST_COORDINATES',
'39.0693,-94.6716').split(',')]
def main():
nws = nwswx.WxAPI('[wxforecast] [email protected]')
result = nws.point_forecast(LAT, LON, return_format=nwswx.formats.JSONLD)
forecast = result['periods'][0]
# create pushover notification
title = f"{forecast['shortForecast']}"
msg = f"""{forecast['detailedForecast']}
Temp: {forecast['temperature']}°{forecast['temperatureUnit']}
Wind: {forecast['windSpeed']} {forecast['windDirection']}
Details: https://forecast.weather.gov/MapClick.php?lon={LON}&lat={LAT}
"""
r = requests.post('https://api.pushover.net/1/messages.json', data = {
'token': os.environ['WXFORECAST_PUSHOVER_APP_KEY'],
'user': os.environ['PUSHOVER_USER_KEY'],
'message': msg,
'title': title,
'device': os.environ['PUSHOVER_DEVICE']
})
if __name__ == '__main__':
main()
wxforecast.service
[Unit]
Description=Send Weather Update
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
Environment="WXFORECAST_PUSHOVER_APP_KEY=RandomAppKEY"
Environment="WXFORECAST_COORDINATES=31.02,-90.56"
Environment="PUSHOVER_DEVICE=weather"
Environment="PUSHOVER_USER_KEY=randomUserGroupKey"
ExecStart=/usr/bin/python3 /home/william/CODE/wxforecast/wxforecast.py
ExecStopPost=/bin/bash /usr/local/bin/sus.sh
StandardError=journal
wxforecast.timer
[Unit]
Description=Send Weather Update
[Timer]
OnCalendar=*-*-* 07:00:00
Persistent=true
WakeSystem=true
Unit=wxforecast.service
[Install]
WantedBy=timers.target
追加情報:Xubuntu 18.04デスクトップ。関係するすべてのファイルは、個別のファイルとしてGistにあります。
Parsa Mousavi-おそらくWIFIが原因です。 python行をシェルスクリプトに移動し、pythonスクリプトを実行する前にスリープコマンドを追加する必要があります。試してみます。明日の朝に報告してください。これは、1か月に1回しか実行されないため、特定の月に無料アカウントの7500 APIリクエストに到達したことがない、または到達しないという唯一の理由のようです。右足を膝の下で切断した後、疲れたので、明白なことは、必要なほど明白ではなかったようです。
修正は、応答するまでgoogleにpingすることでした。以下で追加したスリープを変更しました(Serverfaultにあります)(おそらくバニラのpingで動作する可能性がありますが、これは私が選択したものです):
Sudo apt-get install fping
HOSTNAMES=google.com
while ! fping -q $HOSTNAMES ; do :; done
これで、googleが応答するまでgoogleをpingし、シェルスクリプト内の次のコマンドが実行されます。
正しい方向に向けてプッシュしてくれてありがとう。