システムサービスが起動時に毎分スクリプトを実行することを試みます。スクリプトのステップの1つは、VPN接続を確立することです。このステップは systemd サービスとして実行すると失敗します。
サービスファイル:
[Unit]
Description=Run the checkvpn bash script
[Service]
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
ExecStart=/usr/local/bin/checkvpn.sh
タイマーファイル
[Unit]
Description=checkvpn service timer
[Timer]
OnActiveSec=60
OnCalendar=*-*-* *:*:00
Unit=checkvpn.service
[Install]
WantedBy=multi-user.target
バッシュスクリプト:
#!/bin/bash -l
if [ "$EUID" -ne 0 ]
then echo "Please run as root"
exit
fi
isVpnConnected() {
if [[ $(cyberghostvpn --status) =~ "Wireguard connection found" ]]; then
return 0
else
return 1
fi
}
isDockerRunning() {
if [[ $(docker ps) =~ "some-docker-image" ]]; then
return 0
else
return 1
fi
}
if isVpnConnected; then
if isDockerRunning; then
echo "vpn and docker ok"
else
echo "vpn ok, but docker is not running, starting docker ..."
docker-compose -f /home/davy/git/nookie-config/docker-compose.yaml up -d
fi
else
echo "vpn not ok, connecting ..."
cyberghostvpn --traffic --wireguard --country-code ES --connect
if isVpnConnected; then
if isDockerRunning; then
echo "vpn restored, but docker was still running without vpn"
else
echo "vpn fixed, restarting docker ..."
docker-compose -f /home/davy/git/nookie-config/docker-compose.yaml up -d
fi
else
echo "unable to fix vpn, stopping dockers ..."
docker-compose -f /home/davy/git/nookie-config/docker-compose.yaml down
fi
fi
私が得るエラー:
Feb 12 14:14:02 nookie checkvpn.sh[8490]: Traceback (most recent call last):
Feb 12 14:14:02 nookie checkvpn.sh[8490]: File "cyberghostvpn.py", line 5, in <module>
Feb 12 14:14:02 nookie checkvpn.sh[8490]: File "<frozen importlib._bootstrap>", line 991, in _find_and_load
Feb 12 14:14:02 nookie checkvpn.sh[8490]: File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
Feb 12 14:14:02 nookie checkvpn.sh[8490]: File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
Feb 12 14:14:02 nookie checkvpn.sh[8490]: File "/usr/local/lib/python3.8/dist-packages/PyInstaller/loader/pyimod03_importers.py", line 623, in exec_module
Feb 12 14:14:02 nookie checkvpn.sh[8490]: File "configs/base.py", line 3, in <module>
Feb 12 14:14:02 nookie checkvpn.sh[8490]: File "configs/base.py", line 12, in BaseConfiguration
Feb 12 14:14:02 nookie checkvpn.sh[8490]: TypeError: can only concatenate str (not "NoneType") to str
Feb 12 14:14:02 nookie checkvpn.sh[8490]: [8490] Failed to execute script cyberghostvpn
明らかに、Cyberghost cliユーティリティはPythonで書かれており、何かをインポートできません。私はsystemd環境が私のユーザー環境と異なると仮定していますが、正確に何がわかりません。また、私の環境にあるのと同じパス変数を提供しようとしましたが、何も解決しませんでした。
どんなアイデアがありますか?
davy@nookieの出力: ~$ sudo find / -name "cybergho*"
/home/davy/cyberghostvpn-ubuntu-20.04-1.3.4
/home/davy/cyberghostvpn-ubuntu-20.04-1.3.4/cyberghost
/home/davy/cyberghostvpn-ubuntu-20.04-1.3.4/cyberghost/cyberghostvpn
/home/davy/cyberghost
find: ‘/proc/6687’: No such file or directory
/usr/bin/cyberghostvpn
/usr/local/cyberghost
/usr/local/cyberghost/cyberghostvpn
/etc/wireguard/cyberghost.conf
答え1
systemd環境が私のユーザー環境と異なると仮定していますが、どうなるかわかりません。
(非常に)短いスクリプトで見つけることができます。
#!/bin/bash
printenv > /home/davy/environment_"$( date +%s )"
スクリプトはprintenv
すべての環境変数を一覧表示するコマンドを実行し、出力をに保存します/home/davy/environment_xxxxxxxxxx
。xxxxxxxxxx
ファイル名の一部は、秒単位の現在のUnixタイムスタンプです。 (私がこの特定のファイル名を選択した唯一の理由は、スクリプトが実行されるたびにファイルを上書きしないためですが、名前と保存場所は明らかに変更できます。必要なコンテンツ)。
systemd.service
生成されたファイルとシェルを使用して同じスクリプトを実行したときに生成されたファイルを比較できるように、このスクリプトを実行しますsudo
。これら2つのファイルの違いによってわかりますsystemd
。
これはありそうもないことで、うまくいけば驚くでしょう。ただし、Vars
変数(1行に1つずつ、形式で)のみを一覧表示するファイル(または必要な名前)を作成できます。出力は正確に次のようになります。 same printenv
)が存在するsudo
が存在しないsystemd
場合は、ファイルEnvironment=PATH=...
の行を.service
に変更してEnvironmentFile=/path/to/Vars
からを使用してサービスを再起動しますsudo systemctl daemon-reload
。
FWIW、ユーザーがCyberghostで自動化しようとしたとき、cron
他の場所で述べたのと同じPythonエラーが見つかりました。彼は私が理解できず、保証できない方法で作業することができましたが、おそらくより良い結果を得ることができます。運:
https://forum.ubuntu-fr.org/viewtopic.php?id=2060369(フランス国民)
(英語翻訳)