systemd oneshot Requirement to execute only once

sed работает с одной строкой за раз, но некоторые комментарии на входе несколько строк. Согласно https://unix.stackexchange.com/a/152389/90751 , вы можете сначала использовать tr , чтобы преобразовать перенос строки в какой-либо другой символ. Затем sed может обрабатывать ввод как одну строку, и вы снова используете tr , чтобы восстановить разрывы строк.

tr '\n' '\0' | sed ... | tr '\0' \n'

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

* имеет особое значение в регулярных выражениях, поэтому для соответствия литералу * потребуется экранирование как \ * .

. * жадный - он будет соответствовать максимально длинному тексту, включая дополнительные * / и / * . Это означает первый комментарий, последний комментарий и все, что между ними. Чтобы ограничить это, замените . * более строгим шаблоном: комментарии могут содержать все, что не является «*», а также «*», за которым следует все, кроме «/». Также необходимо учитывать выполнение нескольких * s:

tr '\n' '\0' | sed -e 's,/\*\([^*]\|\*\+[^*/]\)*\*\+/,,g' | tr '\0' '\n'

Это удалит любые разрывы строк в многострочных комментариях, т.е.

data1 /* multiline
comment */ data2

превратится в

data1  data2

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

tr '\n' '\f' | sed -e 's,/\*\(\(\f\)\|[^*]\|\*\+[^*/]\)*\*\+/,\2,g' | tr '\f' '\n'

Специальный символ \ f и использование обратной ссылки, которая, возможно, не соответствует чему-либо, не гарантируют правильную работу во всех реализациях sed . (Я подтвердил, что он работает на GNU sed 4.07 и 4.2.2.)

3
29.09.2016, 21:43
2 ответа

Обновите generate_env_file.sh , чтобы при запуске проверить, существует ли файл блокировки. Если файл блокировки существует, немедленно выйдите.

Если файл блокировки не существует, немедленно коснитесь файла блокировки, затем займитесь созданием файла конфигурации, а затем удалите файл блокировки.

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

И, как указывает @shellter, сайт Unix является более подходящим сайтом для ответов на вопросы systemd в будущем.

0
27.01.2020, 21:30

RemainAfterExit=true является способом. В этом случае Systemd запускает службу, и Systemd считает ее запущенной и работающей. Однако это не покрывает случай, когда нужно выполнить systemctl restart generate_env_file.service. В этом случае systemd повторно запустит вашу службу. Чтобы решить эту проблему, вы можете создать файл-маркер в файловой системе запуска в ExecStartPost= и добавить директиву ConditionFileExists= для проверки существования файла.

5
27.01.2020, 21:30

Теги

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