web-dev-qa-db-ja.com

サスペンドからのウェイクアップでSystemDタイマーを理解するのに助けが必要

ラップトップをウェイクアップする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リクエストに到達したことがない、または到達しないという唯一の理由のようです。右足を膝の下で切断した後、疲れたので、明白なことは、必要なほど明白ではなかったようです。

3
bonelifer

修正は、応答するまでgoogleにpingすることでした。以下で追加したスリープを変更しました(Serverfaultにあります)(おそらくバニラのpingで動作する可能性がありますが、これは私が選択したものです):

Sudo apt-get install fping
HOSTNAMES=google.com
while ! fping -q $HOSTNAMES ; do :; done

これで、googleが応答するまでgoogleをpingし、シェルスクリプト内の次のコマンドが実行されます。

正しい方向に向けてプッシュしてくれてありがとう。

0
bonelifer