계량 연결에서 시스템 타이머가 실행되지 않도록 방지

계량 연결에서 시스템 타이머가 실행되지 않도록 방지

내 이메일을 다운로드하기 위해 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의 답변에 추가되었습니다.

사용의 한 가지 단점 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. 하지만 다음은 몇 가지 일반적인 팁입니다.

  1. 원하지 않는다설치를 직접 수정하십시오 /usr/lib/systemd. 이는 일반적으로 패키지 관리자에 의해 관리되며 업데이트 후에 기본값으로 재설정될 수 있습니다.
  2. 이와 같은 작은 변경의 경우 전체 장치를 복사하거나(덮어쓰기)보다는 구성 파일을 삽입(수정)하는 것이 /etc/systemd좋습니다 ~/.config/systemd. 이렇게 하면 패키지 관리자가 장치를 계속 업데이트합니다(예: 장치가 추가 강화를 받는 경우). man systemd.unit이에 대한 자세한 내용은 다시 참조하세요 .

또한 이 방법은 타이머 대신 서비스를 변경합니다(내장된 프로필을 사용하는 경우에도). 이는 다른 장치가 이 새로운 무제한 제한 없이 서비스에 의존하는 경우 이상적이지 않을 수 있습니다. 이 경우 다른 이름으로 복사하여 새로운 사용자 정의 단위 타이머 쌍을 만든 다음 사용자 정의 서비스만 변경하는 것이 좋습니다.

관련 정보