私の電子メールをダウンロードするために10分ごとに実行されるシステムタイマーがありますofflineimap
。問題は、時には大量の電子メールまたは大容量の添付ファイルを受け取り、携帯電話のデータ通信接続を使用して移動中である可能性があることです。
nmcli
現在アクティブな接続を照会し、その接続がデータ通信接続であることを確認するカスタムスクリプトがあります。その場合、offlineimap
まったく実行されません。
私の質問は、システムタイマーが同じことをすることができるかどうかです。次のように:
[Timer]
OnUnitInactiveSec=10m
RunOnMetered=no
答え1
まず、接続が測定されるかどうかを示すために依存する単位が必要です。たとえば、次のようになります。
[Unit]
Description=Check if the current connection is metered
[Service]
Type=oneshot
ExecStart=check-metered-connection.sh
以下はcheck-metered-connection.sh
簡単なdbusチェックです。
#! /usr/bin/bash
metered_status=$(dbus-send --system --print-reply=literal \
--system --dest=org.freedesktop.NetworkManager \
/org/freedesktop/NetworkManager \
org.freedesktop.DBus.Properties.Get \
string:org.freedesktop.NetworkManager string:Metered \
| grep -o ".$")
if [[ $metered_status =~ (1|3) ]]; then
echo Current connection is metered
exit 1
else
exit 0
fi
これにより、組織はサービスに依存し、次のように開始できます。
Requires=unmetered-connection.service
After=unmetered-connection.service
誰かがこれについて考え、親切にGithubにコードを投稿しました。jdorel/systemd 測定接続の依存関係完全なコードを取得します。
ここにあるすべてのコード例は私のものではありませんが、リンクされたリポジトリからそのままコピーされました。。完全性のためにここにコピーしました。
答え2
これはMarkの答えに追加されました。
使用の1つの欠点unmetered-connection.service
は、データ通信接続があるときにSystemdがこれを「失敗」と見なして、systemctl status
実際に問題がなくてもレポートが「ダウングレード」されることです。これがうまくいくかもしれませんが、気に入らない場合は代替ソリューションがあります。
秘訣はかなり新しいオプションExecCondition=
(だからQ&A、man systemd.service
)をファイルに追加します.service
。 Systemd v243以降が必要ですsystemctl --version
。
このオプションを使用すると、任意のコマンドを実行できるため、実際に必要なものを非常に便利に確認できます。check-metered-connection.sh
以下で再利用しますjdorel/systemd 測定接続の依存関係この例では。
端末に次のコードを追加してください。
# only run when system is on an unmetered connection
# requires https://github.com/jdorel/systemd-metered-connection-dependency
[Service]
ExecCondition=check-metered-connection.sh
サービスがシステム単位(ユーザー単位ではない)であるとします。man systemd.unit
)という名前がofflineimap.service
付いた場合、このファイルを含む設定ファイルになります/etc/systemd/system/offlineimap.service.d/only-on-unmetered.conf
。
[sudo] systemctl [--user] daemon-reload
作業が終わったら実行することを忘れないでください。
ポリスチレン
Systemdを使用すると、すべて同じ目標を達成しているように見えますが、実際にはさまざまな方法で微妙にカスタマイズできます。 Systemdについてよく知らない限り、おすすめ何でも修正する前にしばらく時間をかけてお読みくださいman systemd.unit
。しかし、以下はいくつかの一般的なヒントです。
- 欲しくないインストールを直接修正してください
/usr/lib/systemd
。これは通常パッケージマネージャによって管理され、更新後にデフォルト値にリセットできます。 - このような小さな変更の場合は、デバイス全体をコピー(上書き)するのではなく、設定ファイルを挿入(変更)することをお勧めし
/etc/systemd
ます~/.config/systemd
。これにより、パッケージマネージャはデバイスを継続的に更新します(たとえば、デバイスがさらに強化されている場合など)。man systemd.unit
これについての詳細はもう一度ご覧ください。
また、この方法はタイマーの代わりにサービスを変更します(組み込みプロファイルを使用している場合でも)。これは、他のデバイスがこの新しい無制限の制限なしにサービスに依存している場合に理想的ではないかもしれません。この場合、別の名前でコピーして新しいカスタム単位タイマーペアを作成し、カスタムサービスのみを変更することをお勧めします。