systemd --user
работает как системная служба с именем user@.service
. Это шаблонный сервис. Ваш экземпляр может быть user@1000.service
. Этот номер является вашим идентификатором пользователя (id -u
).
Процедура выключения системы подаст сигнал user@1000.service
об остановке обычным сигналом SIGTERM
. В ответ процесс systemd --user
подаст сигнал об остановке каждой пользовательской службы. [ *]
systemctl cat user@.service
предполагает, что нет особого смысла устанавливать тайм-аут обслуживания пользователя (льготный период )дольше 120 секунд. После этого все пользовательские сервисы получат SIGKILL
от основной системы (PID 1 ). SIGKILL
немедленно приводит к летальному исходу.
Чтобы понять настройки в этом файле, см. man systemd.kill
, а также man systemd.service
.
[*] Технически systemd --user
в ответ на SIGTERM
активирует пользовательский блок exit.target
. Об этом упоминается в man systemd
. Дополнительную информацию оexit.target
:systemctl cat exit.target
скажу вам посмотреть в man systemd.special
:-).
Предполагая, что ваш файл конфигурации не содержит полей со встроенными символами новой строки или запятыми, и предполагая, что вы хотите удалить все файлы с указанным префиксом имени файла только в указанных каталогах (, т.е. не рекурсивно):
#!/bin/sh
while IFS=, read -r directory prefix; do
rm -- "$directory/$prefix"*
done <config.txt
Это считывает первое поле с разделителями-запятыми -в каждой строке в переменную directory
, а остальную часть строки — в переменную prefix
. Затем он использует их для удаления файлов. (См. Где задокументирован аргумент`--`(двойного тире )? для объяснения--
)
Если вам нужно выполнить удаление рекурсивно, под каждым указанным путем к каталогу:
#!/bin/sh
while IFS=, read -r directory prefix; do
find "$directory" -name "$prefix*" -exec rm {} +
done <config.txt
Разница между этими двумя, за исключением find
рекурсивного поиска, заключается в том, что $prefix
будет использоваться, как если бы это был шаблон подстановки в команде find
.
Обратите внимание, что *
необходимо заключать в кавычки при использовании с find
, чтобы оболочка не расширяла его до совпадения имен в текущем каталоге, и что *
должен быть без кавычек , когда используется с rm
в первом цикле выше, так что оболочка расширяет его до всех совпадающих имен.
Если вы не хотите выполнять удаление рекурсивно, но у вас так много файлов, соответствующих сгенерированным шаблонам, что первый цикл выдает ошибку «слишком длинный список аргументов», вы можете хотите сделать дополнительный внутренний цикл,
#!/bin/sh
while IFS=, read -r directory prefix; do
for pathname in "$directory/$prefix"*; do
rm -- "$pathname"
done
done <config.txt
или используйте find
с ограничением пути поиска верхнего -уровня,
#!/bin/sh
while IFS=, read -r directory prefix; do
find "$directory" ! -path "$directory" -prune -name "$prefix*" -exec rm {} +
done <config.txt
Мы используем xargs для передачи путей к файлам из файла config.txt в исполняемый файл sh в его командной строке.
< config.txt xargs -rd'\n' sh -c '
for arg do
find "${arg%,*}" \
-name "${arg##*,}*" \
-type f \
-exec rm -f {} + ;
done
' xargs-sh