Как насчет (принятие Вашей оболочки имеет замену процесса):
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) :)):
Этот сценарий неверен. Максимум семейства 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
, он отправляет сигнал правильному фактическому процессу службы.