Назад | Перейти на главную страницу

Использование службы systemd для создания файла

Я пытаюсь создать службу systemd для автоматической очистки каталога от старых файлов. Если бы я сделал это вручную, я бы использовал пару команд вроде

$ /usr/bin/touch -t $(/usr/bin/date -d'-7day' +%Y%m%d%H%M) /tmp/cutoff
$ /usr/bin/find /path/to/dir ! -newer /tmp/cutoff -exec rm {} \;

Первая строка фактически создает файл-заполнитель в /tmp каталог. Однако следующее определение службы

[Unit]
Description=Cleanup index cache left behind by bup backup
Type=oneshot

[Service]
ExecStart=/usr/bin/touch -t $(/usr/bin/date -d'-7day' +%%Y%%m%%d%%H%%M) /tmp/cutoff
SyslogIdentifier=%p

Не удается создать заполнитель

$ /usr/bin/touch -t $(/usr/bin/date -d'-7day' +%Y%m%d%H%M) /tmp/cutoff
$ ls -l /tmp/cutoff
-rw-r--r--. 1 user group 0 Mar 20 14:36 /tmp/cutoff
$ rm /tmp/cutoff
$ sudo systemctl start cleanup_index_cache
$ ls -l /tmp/cutoff
ls: cannot access '/tmp/cutoff': No such file or directory
$ 
$ sudo systemctl start cleanup.service
$ ls -l /tmp/cutoff

Есть ли способ удалить файлы / каталоги старше определенного возраста с помощью systemd? Есть ли что-то, чего мне не хватает в простой транскрипции команд оболочки в директивы systemd?

systemd-tmpfiles - это функция systemd, которую можно настроить для автоматической очистки старых файлов из каталога. Вместо новой службы, которая требует запуска каждый раз, когда требуется очистка каталога, можно создать файл в /etc/tmpfiles.d/ со следующим содержанием:

# /etc/tmpfiles.d/cleanup_index_cache.conf
d /path/to/dir - - - 7d

Ссылки: tmpfiles.d (5) ; systemd-tmpfiles (8)

systemd не отправляет команды в ExecStart= и его родственников через оболочку. Он выполняет их напрямую. Таким образом, вы не можете использовать такие конструкции оболочки, как $().

Непонятно, зачем вы генерируете дату и все равно касаетесь ею файла. find прекрасно способен самостоятельно находить файлы старше определенного времени.

На странице руководства:

       -mtime n
              File's  data was last modified n*24 hours ago.  See the comments
              for -atime to understand how rounding affects the interpretation
              of file modification times.

Этот бит объясняет:

       -atime n
              File  was  last  accessed n*24 hours ago.  When find figures out
              how many 24-hour periods ago the file  was  last  accessed,  any
              fractional part is ignored, so to match -atime +1, a file has to
              have been accessed at least two days ago.

find также может удалять файлы самостоятельно и не требует обращения к rm (и это потенциально плохая идея по ряду причин).

       -delete
              Delete files; true if removal succeeded.  If the removal failed,
              an  error message is issued.  If -delete fails, find's exit sta‐
              tus will be nonzero (when it eventually exits).  Use of  -delete
              automatically turns on the `-depth' option.

              Warnings:  Don't  forget that the find command line is evaluated
              as an expression, so putting -delete first will make find try to
              delete everything below the starting points you specified.  When
              testing a find command line that you later intend  to  use  with
              -delete,  you should explicitly specify -depth in order to avoid
              later surprises.  Because -delete  implies  -depth,  you  cannot
              usefully use -prune and -delete together.

Итак, чтобы удалить файлы старше 7 дней, вы можете просто запустить find напрямую, без каких-либо других забавных вещей:

/usr/bin/find /directory -mtime +6 -delete