Сервер Node.js с daemontools постоянно перезапускается

Как насчет (принятие Вашей оболочки имеет замену процесса):

for file in "${filelist[@]}"; do
    cat <(printf "%s" "$prefix") "$file" <(printf "%s" "$suffix") > "$file"_$$\ 
     && mv "$file"_$$ "$file"
done

или, лучше, в (непротестированном) Perl:

perl -MTie::File -e '
    @ARGV//=;
    chomp(@ARGV);
    for(@ARGV){
        tie @lines,"Tie::File",$_;
        @lines=($ENV{prefix} @lines $ENV{suffix})
    }' "${filelist[@]}"

Для альтернативного подхода, если префикс и суффикс фиксируются, видят следующий вопрос (который также, оказывается, о TEX (La) :)):

2
02.10.2015, 22:17
1 ответ

Этот сценарий неверен. Максимум семейства daemontools заключается в том, что программа, выполняемая ./ run , должна быть самим процессом службы , а не его родителем, дедушкой или дедушкой или другим родственником. Сервисы запускаются, а не порождаются.

Использование exec в последней строке является правильной идеей, но ее нарушает следующее использование явного bash -c . В любом случае в этом нет необходимости, поскольку для сценария ./ node указан интерпретатор сценария #! / Bin / bash , и он (предположительно) является исполняемым. Лучше

#!/bin/bash
exec setuidgid nodeuser ./node

Это, конечно, может быть nosh (из одноименного набора инструментов ) или скрипт execlineb , потому что нет реальной необходимости в тяжелом Bourne Again shell только для запуска одной единственной команды setuidgid . Таким образом:

#!/bin/nosh
setuidgid nodeuser
./node
или
#!/command/execlineb -P
s6-setuidgid nodeuser
./node

Затем, когда диспетчер служб приходит, чтобы отключить службу в ответ на svc -d , он отправляет сигнал правильному фактическому процессу службы.

Дополнительная литература

3
27.01.2020, 22:05

Теги

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