Как записать runit пользовательский сценарий остановки

Главное:

  • устраните строку с sed выход из набора символов
  • необходимо будет затем заменить переменную $tmp с $in где это появляется как входной файл (и Вы не должны будете очищать его), но сохраните его как выходной файл
  • использовать -r с чтением для сохранения обратных косых черт: while read -r line
  • использовать -F (фиксированные строки) с grep предотвратить regex интерпретацию: table=($(grep -F -r -- "$line" "$path"))

Дополнительные примечания:

  • не действительно необходимо использовать linesTable массив, просто сделайте свою обработку, поскольку Вы читаете строки
  • можно использовать sort -u и устраните uniq
  • не необходимо сбросить переменные, оболочка сделает это для Вас, когда сценарий выйдет
  • Вы не должны действительно называть внешнее tee неоднократно в цикле. можно или использовать другого echo: echo "$line" >> "$tmp" или помещенный tee вне цикла, так как Вы уже добрались echo внутри: done | tee "$tmp" (затем Вам не нужно -a)
  • Вы могли устранить tee и последнее использование временного файла путем передачи по каналу вывода цикла непосредственно в 'вид-u> "$out"
  • все переменные, которые содержат имена файлов, должны всегда заключаться в кавычки
  • table не должен действительно быть массив, так как Вы не получаете доступ к отдельным элементам
11
задан 23 July 2012 в 19:13
3 ответа

Из документации

Для каждого управляющего символа c, отправленного в труба управления, сначала идет проверяет, существует ли service / control / c и является ли она исполняемой. Если да, то начинается service / control / c и ожидает его завершения, прежде чем интерпретировать команда. Если программа завершается с кодом возврата 0, runv воздерживается от отправки сервису соответствующего сигнала. Команда o есть всегда рассматривается как команда u. По команде d первое обслуживание / контроль / t проверяется, а затем сервис / контроль / д. Сначала по команде x проверяется service / control / t, а затем service / control / x. Контроль дополнительной службы журнала нельзя настроить.

Это означает, что вам нужно создать имя_службы / control / X , где X - исполняемый файл, который будет запускаться, когда вы отправите связанный sv для службы, например d (вниз). Если ваш сценарий завершается со статусом 0, он не будет пытаться отключить саму службу.

В основном вам нужен исполняемый скрипт на / etc / sv / / control / d , который будет делать все, что вы хотите, и убивать службу, очищать pid и т. Д.

12
ответ дан 2 December 2019 в 21:49

Простой ответ - назвать сценарий очистки «service / finish». Этот скрипт выполняется при выходе из "обслуживания / запуска".

Существует также интерфейс "service / control / ctrl_char". Он позволяет выполнять различные действия в зависимости от того, какую команду вы отправляете в runv.

2
ответ дан 2 December 2019 в 21:49

Мне пришлось самому решать эту проблему для докера. У меня был запущен сервер uwsgi, и докер отправил ему неверный сигнал (TERM вместо INT) при остановке контейнера.

Идея файлов control / x состоит в том, чтобы реагировать на полученный сигнал. В моем случае я бы поместил файл t для сигнала завершения в управление, поскольку это файл, зарезервированный для сигнала термина. Скрипт должен быть исполняемым.

#!/bin/bash
kill -INT `cat /tmp/project-master.pid`

Скрипт отправляет сигнал int процессу uwsgi, что я и хочу.

Если управляющий скрипт завершается без ошибок (код возврата 0), исходный сигнал не будет отправлен на

Таким образом, в моем случае я смог получить термин сигнал и вместо этого отправить сигнал int процессу службы.

2
ответ дан 2 December 2019 в 21:49