말풋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
다시 시작할 때 서비스가 실패하도록 해야 합니다.