Запуск spawn-fcgi и fcgiwrap в NetBSD с помощью daemontools

К сожалению spawn-fcgi умеет порождать несколько процессов только отключаясь от терминала, поэтому через daemontools можно запустить только в однопроцессном режиме. Запустить несколько процессов можно в fcgiwrap, но если так сделать, то эти процессы отделяются от spawn-fcgi и при остановке сервиса останавливается только головной процесс, а остальные продолжают работать в фоне, удерживая сокет-файл. При этом обработка CGI-запросов фактически продолжается, а запустить spawn-fcgi снова не получается, т.к. сокет-файл уже существует и занят процессами, работающими в фоне.

Таким образом, можно запустить только один процесс spawn-fcgi, который заменится одним процессом fcgiwrap. К счастью, в моём случае это не является проблемой, т.к. для обслуживания запросов от ikiwiki, с которой работаю я один, больше одного процесса понадобиться и не может.

Создаём каталог сервиса /service/.spawnfcgi/:

# mkdir /service/.spawnfcgi/

Создадим внутри каталога сервиса файл run со следующим содержимым:

#!/bin/sh

exec 2>&1

exec \
/usr/pkg/bin/spawn-fcgi -u stupin -g users -s /var/run/ikiwiki.sock -U nginx -G nginx -M 0600 -d /home/stupin/dst/ -n -- \
/usr/pkg/sbin/fcgiwrap -f

И сделаем его исполняемым:

# chmod +x /service/.spawnfcgi/run

Создадим каталог /service/.spawnfcgi/log/:

# mkdir /service/.spawnfcgi/log/

Создадим внутри него скрипт run со следующим содержимым:

#!/bin/sh

exec \
setuidgid multilog \
multilog t /var/log/spawnfcgi/

И сделаем его исполняемым:

# chmod +x /service/.spawnfcgi/log/run

Теперь создадим каталог /var/log/spawnfcgi, в котором multilog будет вести журналы работы сервиса:

# mkdir /var/log/spawnfcgi/

Установим пользователя и группу multilog владельцами этого каталога:

# chown multilog:multilog /var/log/spawnfcgi/

Запустим сервис средствами daemontools, переименовав каталог сервиса:

# mv /service/.spawnfcgi /service/spawnfcgi