Как работает системный таймер?

Попробуйте использовать этот скрипт, он сохранит совпадающие строки в removed.csv, а все остальное будет отправлено на стандартный вывод. Обратите внимание, что строка username_prefix user_type expiry_date commentsне будет отправлена ​​в файл removed.csv, поэтому ее необходимо добавить вручную.

#!/usr/bin/env bash

id_file=${1}
csv_file=${2}
removed_file=${3}

while read -r user; do

  matched=''

  while read -r id; do
      if <<< "${user}" grep -F -e "${id}" > '/dev/null'; then
        matched='yes'
        break
      else
        matched='no'
      fi
  done < "${id_file}"

  [[ "${matched}" == 'yes' ]] && echo "${user}" >> "${removed_file}"
  [[ "${matched}" == 'no' ]] && echo "${user}"

done < "${csv_file}"

Пример:

$ myscript.sh ids.txt users.csv removed.csv
username_prefix user_type   expiry_date comments
33333333    SomeTypeHere    31/12/2017  EDT0029448
44444444    SomeTypeHere    31/12/2017  EDT0029448
55555555    SomeTypeHere    31/12/2017  EDT0029448
$ cat removed.csv
11111111    SomeTypeHere    31/12/2017  EDT0029448
22222222    SomeTypeHere    31/12/2017  EDT0029448
1
01.09.2020, 10:15
1 ответ

К сожалению, проблема, с которой вы столкнулись, не воспроизводится. Судя по комментарию ;OnCalendar=, вы меняете поле.Вы уверены, что использовали systemctl daemon-reloadмежду редактированием и запуском таймера?

Когда я проверяю это на своей системе, я вижу:

$ systemctl --user cat mytime.timer
# /home/stew/.config/systemd/user/mytime.timer
[Unit]
Description=Test timer

[Timer]
OnCalendar=hourly


$ systemctl --user start mytime.timer
$ systemctl --user status mytime.timer
● mytime.timer - Test timer
     Loaded: loaded (/home/stew/.config/systemd/user/mytime.timer; static)
     Active: active (waiting) since Tue 2020-09-01 09:49:14 CEST; 7s ago
    Trigger: Tue 2020-09-01 10:00:00 CEST; 10min left
   Triggers: ● mytime.service

Sep 01 09:49:14 stewbian systemd[1691]: Started Test timer.

Затем я подождал 10 минут до истечения первого таймера и получил:


$ journalctl --user -u mytime.timer -u mytime.service
-- Logs begin at Mon 2020-07-06 04:41:08 CEST, end at Tue 2020-09-01 10:00:00 CEST. --
Sep 01 09:49:14 stewbian systemd[1691]: Started Test timer.
Sep 01 10:00:00 stewbian systemd[1691]: Starting mytime.service...
Sep 01 10:00:00 stewbian systemd[1691]: mytime.service: Succeeded.
Sep 01 10:00:00 stewbian systemd[1691]: Finished mytime.service.


$ systemctl --user status mytime.timer
● mytime.timer - Test timer
     Loaded: loaded (/home/stew/.config/systemd/user/mytime.timer; static)
     Active: active (waiting) since Tue 2020-09-01 09:49:14 CEST; 10min ago
    Trigger: Tue 2020-09-01 11:00:00 CEST; 59min left
   Triggers: ● mytime.service

Sep 01 09:49:14 stewbian systemd[1691]: Started Test timer.

В данном случае я использовал OnCalendar=hourly. Первый триггер был в начале следующего часа. Второй триггер устанавливается на начало следующего часа.


Поскольку я подозреваю, что проблема связана с daemon-reload, я попытался воспроизвести вашу проблему, изменив OnCalendar=. Я нашел:

  1. Если я использую systemctl daemon-reload, изменение применяется
  2. Если I systemctl stop, то systemctl start, изменение применяется, даже без daemon-reload.
  3. Если я systemctl startне останавливаю предыдущий таймер, изменение не применяется и я получаю предупреждение об этом:
$ systemctl --user start mytime.timer
Warning: The unit file, source configuration file or drop-ins of mytime.timer
  changed on disk. Run 'systemctl --user daemon-reload' to reload units.
1
18.03.2021, 23:08

Теги

Похожие вопросы