Я пытаюсь создать службу 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