systemd 타이머를 사용하여 매일 다른 정확한 시간에 유틸리티를 시작하고 매개변수를 전달합니다.

systemd 타이머를 사용하여 매일 다른 정확한 시간에 유틸리티를 시작하고 매개변수를 전달합니다.

말풋Meteor 2 위성에서 데이터를 캡처하기 위한 명령줄 유틸리티입니다. 위성은 매일 다른 시간에 오버헤드를 전달하며 시스템 타이머를 사용하여 mlrpt올바른 매개변수로 시작하고 싶습니다 .

API에서 얻은 시간부터 시작합니다.

    startDate start_times end_times duration
1  2019-08-25       17:51     18:05       14
2  2019-08-25       19:31     19:45       14
3  2019-08-26       05:07     05:21       14
4  2019-08-26       06:47     07:01       14
5  2019-08-26       19:11     19:25       14
6  2019-08-27       06:27     06:42       15
7  2019-08-27       18:51     19:06       15
8  2019-08-28       06:07     06:22       15
9  2019-08-28       18:31     18:46       15
10 2019-08-29       05:47     06:02       15
11 2019-08-29       18:11     18:26       15
12 2019-08-30       05:27     05:42       15
13 2019-08-30       17:51     18:06       15
14 2019-08-30       19:31     19:45       14
15 2019-08-31       05:08     05:22       14
16 2019-08-31       06:48     07:02       14
17 2019-08-31       19:11     19:26       15
18 2019-09-01       06:27     06:42       15
19 2019-09-01       18:51     19:07       16
20 2019-09-02       06:07     06:23       16
21 2019-09-02       18:31     18:47       16
22 2019-09-03       05:47     06:03       16

mlrpt를 실행하려는 모든 형식에 대해mlrpt $startT-$stopT -t $durationMin

이 서비스 파일로 시작합니다.

~/.config/systemd/user/mlrpt.service
[Unit]
Description=Capture Meteor satellite data using mlrpt
DefaultDependencies=no
Wants=local-fs.target time-sync.target
After=local-fs.target time-sync.target

[Service]

Type=simple
ExecStart=/usr/local/bin/mlrpt $START_TIME-$END_TIME -t $DURATION

mlrpt타이머 파일이 적절한 시간에 시작될 뿐만 아니라 올바른 매개변수를 유틸리티에 전달하도록(매번 다름) 타이머 파일을 어떻게 설정합니까 ? 비슷한 템플릿이 필요한 것 같아요

~/.config/systemd/user/mlrpt.timer
[Unit]
Description=Run mlrpt when a satellite is overhead

[Timer]
OnCalendar=
Persistent=true

[Install]
WantedBy=timers.target

하지만 다음에 어디로 가야 할지 잘 모르겠습니다. 올바른 타이머 파일의 예가 있다면 타이머 파일을 생성하는 스크립팅 기술이 있을 것입니다.

답변1

이러한 일회성 비반복 작업의 경우 더 나은 솔루션을 찾은 것 같습니다 systemd-run. 목록의 첫 번째 항목에 대해 실행할 스크립트를 작성합니다.systemd-run --user --on-calendar="2019-08-25 19:51" /usr/local/bin/mlrpt "17:51-18:05" -t 14

답변2

또 다른 접근 방식은 타이머 없이 여러 요소를 하나의 서비스 파일에 결합하는 것입니다. 이러한 요소는 다음과 같습니다.

  • "mlrpt-textfile"에서 사용자 정의 varenv로 인코딩된 단일 위성 채널의 mlrpt 매개변수를 읽는 지침이 있는 "자체 재시작" Type=oneshot서비스입니다 . EnvironmentFile=/path/to/mlrpt-textfile매개변수는 1) $START_TIME 및 2) $END_TIME(위성 전송의 경우), 3) 전송 $DURATION, 4) 다음 전송까지 $WAIT입니다.

  • 두 개의 텍스트 파일. 예를 들어 "mlrpt-list"라는 항목에는 22개 항목 목록과 유사하지만 동일하지는 않은 사용자 정의 mlrpt 매개변수의 전체 목록이 포함되어 있습니다. 하나의 항목만 포함하는 또 다른 텍스트 파일(위에서 언급한 "mlrpt-textfile"입니다)

  • "mlrpt-list"의 시작 부분부터 첫 번째 항목을 읽고 이를 "mlrpt-textfile"에 복사한 다음 "mlrpt-list"의 첫 번째 항목을 삭제하고 다음과 동일한 프로세스를 반복하는 메커니즘(간단한 스크립트 포함) "mlrpt-list"에 더 이상 항목이 없을 때까지 필요합니다(참고: "mlrpt-textfile"에 복사하면 추가되지 않고 덮어써야 합니다).

이제 oneshot-service 파일은 세 가지 요소를 모두 작동하는 솔루션으로 결합하여 대략 다음과 같이 보일 것입니다. 원샷을 사용하는 주된 이유는 하나의 명령뿐만 아니라 여러 ExecStart=명령도 수용할 수 있다는 것입니다. 설계상 이러한 ExecStart명령은 차례로 실행됩니다. 이를 통해 단일 일회용 서비스 단위를 통해 위의 "메커니즘"을 생성하고 실행할 수 있습니다.

# /etc/systemd/system/myservice.service

[Unit]
Description=my service Service
ConditionPathExists=/path/to/mlrpt-textfile # contains $START_TIME, $END_TIME, $WAIT,     
                                            # and $DURATION for a single pass
ConditionFileNotEmpty=/path/to/mlrpt-textfile
EnvironmentFile=/path/to/mlrpt-textfile

[Service]
Type=oneshot
ExecStart=/usr/local/bin/mlrpt $START_TIME-$END_TIME -t $DURATION
ExecStart=/bin/sleep $WAIT
ExecStart=/path/to/script # script copies one entry from mlrpt-list to mlrpt-textfile
ExecStopPost=/bin/systemctl restart myservice.service

[Install]

물론 이를 위해서는 더 많은 개선이 필요합니다(예: 필요에 따라 종속성을 추가해야 함). 이 스크립트는 마지막 패스 후 서비스가 실패하도록 하는 데에도 사용해야 합니다. 예를 들어 마지막 패스 후 "mlrpt-textfile"의 항목을 지워 ConditionFileNotEmpty다시 시작할 때 서비스가 실패하도록 해야 합니다.

관련 정보