TOP="`pwd -P`" \
find . -type d -exec sh -c '
for d
do
cd "$d" && \
find . ! -name . -prune -type f -exec sh -c '\''
while IFS=\; read -r pat repl
do
rename "s/$pat/$repl/g" "$@"
N=$#
for unmoved
do
if [ -f "$unmoved" ]
then
set X ${1+"$@"} "$unmoved"
shift
fi
done
shift "$N"
case $# in 0 ) break ;; esac
done < patterns.csv
'\'' x \{\} +
cd "$TOP"
done
' x {} +
find
только на сетевые каталоги и выполните sh
одним глотком. Это сводит к минимуму количество вызовов sh
. find
в каждом из этих каталогов для сетевых обычных
файлов только на уровне глубины 1 и запустите их в sh
одним глотком. . Это сводит к минимуму количество вызовов утилиты rename
. while
для чтения различных пар шаблон <-> замена
и примените их ко всем обычным
файлам. переименования
-изменения мы сохраняем примечание о том, сохранился ли файл после процесса переименования
. Если мы обнаружим, что файл все еще существует, это означает, что по какой-то причине он не может быть переименован и, следовательно, будет опробован на следующей итерации pat/repl
. OTOH, если файл был успешно переименован, то мы НЕ применяем следующую итерацию pat/repl
к этому файлу, удаляя его из списка аргументов командной строки. Я собираюсь написать этот ответ с точки зрения FreeBSD, но он должен быть применим к Linux и Debian... имена пакетов и прочее могут измениться.
Я был так же недоволен spawn-fcgi. На FreeBSD у него есть сценарий rc.d, но он не подчиняется правилам rc.d (например, он не может "перезапустить").
В самом низу руководства по spawn-fcgi, однако, упоминается supervise. После некоторого поиска мы обнаружили "daemontools" ... На FreeBSD были пакеты для daemontools и daemontools-encore. Пакет -encore казался более новым и имел больше возможностей, поэтому я выбрал его. Моя версия daemontools-encore - 1.10_1.
На FreeBSD для svscan предоставляется rc.d скрипт. На FreeBSD он сканирует /var/service на наличие подкаталогов и запускает "supervise" для каждого из них. Я принял эту конфигурацию по умолчанию и поместил svscan_enable="YES"
в /etc/rc.conf. Для Linux, я не знаю, как в скрипте rc, но там сказано, что /service - это каталог по умолчанию.
Внутри /var/service я создал rt-fcgi и внутри rt-fcgi я создал run. "run" содержит:
#!/bin/sh
spawn-fcgi -u www -g www -s /tmp/rt.sock -n -- /usr/local/sbin/rt-server.fcgi
Очевидно, что в linux, это должно содержать пользователя и группу, которые вы используете, а также расположение вашего rt-server.fcgi.
Система svscan, похоже, рекламирует последние несколько строк ошибки в заголовке процесса. Есть и другие варианты. Мой выглядит так:
46495 - IJ 0:00.01 /usr/local/bin/readproctitle service errors: ...tory (/var/run/rt44/data/gpg). GnuPG support has been disabled (/usr/local/lib/perl5/site_perl/RT/Config.pm:790)\n[52465] [Tue Mar 7 21:09:54 2017] [warning]: The requested port (443) does NOT match the configured WebPort (80). Perhaps you should Set($WebPort, 443); in RT_SiteConfig.pm, otherwise your internal hyperlinks may be broken. (/usr/local/lib/perl5/site_perl/RT/Interface/Web.pm:1328)\n
... это означает, что у меня неправильно настроен gnupg. Похоже, что там можно искать ошибки и прочее, если только вы не настроили журнал для svscan.
Это довольно тяжелый бит для одного fcgi, но он консервированный и работает. Он имеет дело с выходом скрипта по какой-либо причине, но не управляет PID файлом или сокетом (кроме создания файла сокета).
Должен сказать, что стандарт WSGI мне нравится гораздо больше, чем этот беспорядок.