なんでもrunit化

旧daemontoolsはあたしにとっての重宝品でした
何もかも落ちたらすぐ起動してくれるという
デーモンのためにあるツールであることは変わりありません

また、daemontoolsやrunit化することによって
マルチスレッドでデーモンが起動するので
サーバーの起動速度の向上にもなります

難点はメモリを食うぐらいかしら

とりあえず本記事はrunitを使ったものです

## 前提
FreeBSD aach64（要するにラズパイ4)


/usr/local/etc を /etc に
/usr/local/bin を /usr/bin に書き換えれば
Linuxにも対応できていますが、動作確認はしていません

## サービスの作成方法
- 本来のサービスを止める (service xxxx stopとか/etc/rc.conf とかに）
- mkdir -p /var/service/.SERVICENAME/log （ドットがついていることに注目）
- /var/service/.SERVICENAME/log/run　に以下を書く
```sh:/var/service/.SERVICENAME/log/run
#!/bin/sh
exec chpst -uroot svlogd -tt ./main
```
- chmod 755 /var/service/.SERVICENAME/log/run
- これより下にある各サービスの起動スクリプトを /var/service/.SERVICENAME/run に記載する
- chmod 755 /var/service/.SERVICENAME/run
- （テスト） sh /var/service/.SERVICENAME/run （Ctrl+Cで終了）
- mv /var/service/.SERVICENAME /var/service/SERVICENAME

これでデーモンが起動します

## 簡単なサービスの起動と終了

- sv up SERVICENAME
- sv down SERVICENAME
- sv restart SERVICENAME
- sv reload SERVICENAME
- sv status SERVICENAME

## 個々のサービスのrunファイルの書き方

### Apache2
```sh:/var/service/apache/run
#!/bin/sh
# sleep 4
exec /usr/local/sbin/httpd -DNO_DETACH
```

注：sleep 4 とありますが、nginx にリバースプロクシをさせるときに必要

### nginx
```sh:/var/service/nginx/run
#!/bin/sh
exec /usr/local/sbin/nginx -p -g "daemon off;"
```

### mysqld
```sh:/var/service/mysqld/run
#!/bin/sh
cd /
umask 077

MYSQLADMIN='/usr/local/bin/mysqladmin --defaults-extra-file=/usr/local/etc/mysql/debian.cnf'

trap "$MYSQLADMIN shutdown" 0
trap 'exit 2' 1 2 3 15

/usr/local/bin/mysqld_safe & wait
```

なお、mariadbでは確認していません

### php-fpm
```sh:/var/service/php-fpm/run
#!/bin/sh
exec 2>&1
exec /usr/local/sbin/php-fpm --nodaemonize
```
### unbound
```sh:/var/service/unbound/run
#!/bin/sh
sleep 3
exec 2>&1
exec /usr/local/sbin/unbound -d -p
```

sleep 3とありますが、nsdを先に起動させたい時のみ必要

### nsd
```sh:/var/service/nsd/run
#!/bin/sh
sleep 2
exec 2>&1
exec /usr/local/sbin/nsd -c -d
```

### clamav
#### clamd
```sh:/var/service/clamav-clamd/run
#!/bin/sh
PATH="/usr/bin:/bin"
exec /usr/local/sbin/clamd --foreground 2>&1
```

#### freshclam
```sh:/var/service/clamav-freshclam/run
#!/bin/sh
PATH="/usr/bin:/bin"
exec /usr/local/bin/freshclam  --foreground 2>&1
```

### Samba
#### smbd
```sh:/var/service/smbd/run
#!/bin/sh
exec 2>&1
exec /usr/local/sbin/smbd -F -d3
```

-d3 とあるが起動したいプロセス数を指定する

#### nmbd
```sh:/var/service/nmbd/run
#!/bin/sh
exec 2>&1
exec /usr/local/sbin/nmbd -F -d1
```

-d1 とあるが起動したいプロセス数を指定する

### postfix
```sh:/var/service/postfix/run
#!/bin/sh
exec 2>&1
umask 022
exec /usr/local/sbin/postfix start-fg
```

※このスクリプトではdownしません

### dovecot
```sh:/var/service/dovecot/run
#!/bin/sh
exec 2>&1
exec /usr/local/sbin/dovecot -F
```

### amavisd
```sh:/var/service/amavisd/run
#!/bin/sh
exec /usr/local/sbin/amavisd foreground 2>&1
```

※このスクリプトではdownしません

### ntpd
```sh:/var/service/ntpd/run
#!/bin/sh
exec 2>&1
/usr/sbin/ntpdate ntp.jst.mfeed.ad.jp &
/bin/sleep 5
#exec /usr/local/sbin/ntpd -d
exec /usr/sbin/ntpd -n
```

/usr/sbin/ntpdはntpd - NTP daemon program - Ver. 4.2.8p18
/usr/local/sbin/ntpdはopenntpd

これはバッテリーを搭載していないラズパイ用なので
一度時計を合わせてからでないとうまくいきません

### dhcpd
```sh:/var/service/dhcpd/run
#!/bin/sh
exec 2>&1
exec /usr/local/sbin/dhcpd -f -d --no-pid -cf /var/service/dhcpd/dhcpd.conf -lf /var/service/dhcpd/dhcpd.lease genet0
```

### iperf3
こういうのをデーモンにするかどうかはアレですが
```sh:/var/service/iperf3/run
#!/bin/sh
exec 2>&1
exec /usr/local/bin/iperf3 -s
```