Главное:
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
не должен действительно быть массив, так как Вы не получаете доступ к отдельным элементамИз документации
Для каждого управляющего символа 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 /
, который будет делать все, что вы хотите, и убивать службу, очищать pid и т. Д.
Простой ответ - назвать сценарий очистки «service / finish». Этот скрипт выполняется при выходе из "обслуживания / запуска".
Существует также интерфейс "service / control / ctrl_char". Он позволяет выполнять различные действия в зависимости от того, какую команду вы отправляете в runv.
Мне пришлось самому решать эту проблему для докера. У меня был запущен сервер uwsgi, и докер отправил ему неверный сигнал (TERM вместо INT) при остановке контейнера.
Идея файлов control / x состоит в том, чтобы реагировать на полученный сигнал. В моем случае я бы поместил файл t
для сигнала завершения в управление, поскольку это файл, зарезервированный для сигнала термина. Скрипт должен быть исполняемым.
#!/bin/bash
kill -INT `cat /tmp/project-master.pid`
Скрипт отправляет сигнал int процессу uwsgi, что я и хочу.
Если управляющий скрипт завершается без ошибок (код возврата 0), исходный сигнал не будет отправлен на
Таким образом, в моем случае я смог получить термин сигнал и вместо этого отправить сигнал int процессу службы.