計量接続でシステムタイマーが実行されないようにする

計量接続でシステムタイマーが実行されないようにする

私の電子メールをダウンロードするために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&Aman 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。しかし、以下はいくつかの一般的なヒントです。

  1. 欲しくないインストールを直接修正してください/usr/lib/systemd。これは通常パッケージマネージャによって管理され、更新後にデフォルト値にリセットできます。
  2. このような小さな変更の場合は、デバイス全体をコピー(上書き)するのではなく、設定ファイルを挿入(変更)することをお勧めし/etc/systemdます~/.config/systemd。これにより、パッケージマネージャはデバイスを継続的に更新します(たとえば、デバイスがさらに強化されている場合など)。man systemd.unitこれについての詳細はもう一度ご覧ください。

また、この方法はタイマーの代わりにサービスを変更します(組み込みプロファイルを使用している場合でも)。これは、他のデバイスがこの新しい無制限の制限なしにサービスに依存している場合に理想的ではないかもしれません。この場合、別の名前でコピーして新しいカスタム単位タイマーペアを作成し、カスタムサービスのみを変更することをお勧めします。

関連情報