запись загруженных модулей Apache на диск перед остановкой или перезапуском службы systemd

ПРИМЕЧАНИЕ:При написании ниже я использовал OpenBSD find, в которой -execdir utility {} ';'заменит {}базовым именем найденных файлов. В GNU find{}также будет базовым именем найденного файла, но к нему будет дополнительно добавляться ./, что делает первую команду findниже бесполезной. Для пользователей GNUfind(большинство людей на Linux, например ), прокрутите вниз до других вариантов решения.


Вы хотите найти все .cфайлы в каталоге lokeshили ниже него и добавить к их именам префикс x_.

find lokesh -type f -name '*.c' -execdir echo mv {} x_{} ';'

Выражения -type fи -name '*.c'найдут все соответствующие файлы, а -execdir mv {} x_{} ';'переименует найденные файлы.

Выражение -execdirне является стандартным, но большинство реализаций findподдерживают его. Он отличается от -execтем, что данная утилита выполняется с родительским каталогом найденного пути в качестве рабочего каталога. Поэтому {}в командной строке будет базовым именем файлов, которые мы хотим переименовать (, а не полным путем, как в случае с-exec).

Запустите это один раз, а затем удалите echo, когда увидите, что он работает правильно. echoпредотвратит фактическое переименование файлов mv.


В системах, которые не поддерживают-execdir(или не поддерживают -execdir, как это делает OpenBSD):

find lokesh -type f -name '*.c' \
    -exec sh -c 'for name do echo mv "$name" "${name%/*}/x_${name##*/}"; done' sh {} +

или, короче, но чуть менее эффективно,

find lokesh -type f -name '*.c' \
    -exec sh -c 'echo mv "$1" "${1%/*}/x_${1##*/}"' sh {} ';'

В обоих этих вариантах используется короткий сценарий оболочки, который в конечном итоге делает одно и то же.:

mv "$name" "${name%/*}/x_${name##*/}"

Это перемещает файл с полным путем в $nameна новое имя с префиксом x_в том же каталоге. Замена параметра ${name%/*}эквивалентна $( dirname "$name" )и дает родительский каталог пути, а ${name##*/}эквивалентна $( basename "$name" ), который дает базовому имени (компонент имени файла )имени пути.

0
25.08.2020, 19:26
1 ответ

Похоже, вы получаете сообщение об ошибке использования. apachectlотвечает так, как если бы вы вызвали его как:

/usr/sbin/apachectl '-M > /home/ciasto/services/logs/apache2/loaded_mods'

Вы можете видеть, что аргументы :-M, >,/home/...

Строка ExecStop=не является shи не поддерживает некоторые операторы sh, такие как &, >или |. Если вы хотите использовать эти операторы, вызовите оболочку напрямую и передайте команду в качестве аргумента:

ExecStop=+/bin/sh -c '/usr/sbin/apachectl -M > /home/ciasto/services/logs/apache2/loaded_mods'

Как вы заметили в комментариях, у вашего сервиса есть User=www-data. www-dataможет не иметь разрешения на выполнение для вещей в sbinили разрешения на запись для /home/ciasto/*. Поэтому вам может потребоваться выполнить эту команду (и только эту команду )с правами root, в то время как другие строки по-прежнему будут выполняться как www-data. Использование ExecStop=+/bin/shвместо ExecStop=/bin/shсделает это за вас.

Небольшая демонстрация:

User=www-data
ExecStop=/usr/bin/whoami
ExecStop=+/usr/bin/whoami

напишет следующее в журнал:

www-data
root
1
18.03.2021, 23:10

Теги

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