D.J.BツールのdaemontoolsをTermuxで動かしてみたよ!

じゃんくはっく
じゃんくはっく

ぴーちゃん、DJBのdaemontoolsって知ってる?

・・・まったく知りません!

ぴー
ぴー
じゃんくはっく
じゃんくはっく

デーモンを起動管理させるツールなんだけど、これがTermuxで動かせないかな?ってチャレンジしてみたよ。

またマニアックなネタですね!w

ぴー
ぴー

はいな! またマニアックネタかもしれませんので需要はあまり無いかもしれませんね。w

daemontoolsとは?

 このツールは、DJBことダニエル・ジュリアス・バーンスタインさん(WIKI参照)が作ったツール群です。DJBさんは、qmailやdjbdnsというメールやDNSも作っています。daemontoolsは、全部で17個の単体プログラムで作られている常駐するプログラムを起動管理するものです。

 DJBツールは、設定や取り扱いがよくわからんという人もいて好き嫌いの別れるツールです。しかし、驚異的にバグが少なく非常に興味深い作りになっています。

その昔、sendmailやbindに嫌気がさしてqmailやdjbdnsを使っていた時期があったのですが、rpmやdebパッケージなどがないので設定はそれなりにしないと動きません。作者がバイナリ配布を認めていないんです。その為、RedHatはqmailのサポートを明示的に切り捨てています。ちなみに、無償で登録できるRedHatの開発者アカウントがあれば、ナレッジも読めますよ。

Red Hat は、Red Hat Enterprise Linux で qmail SMTP サーバーの使用をサポートしていますか?

https://access.redhat.com/ja/articles/2540051

そんな感じでDJB作のソフトウェアを10年ぶりくらいに使ってみました。あまりに久しぶりすぎて、だいぶ使い方とか忘れていましたがなんとか動いているように見えますのでちょっとメモしておきます。

daemontoolsの概略

daemontools とは、デーモンを監視するツールのことで、qmail の作者 D.J.B. によるツールの事。メリットは、daemontools によって監視させておけば、 自動的に再起動してくれます。注意事項は以下。

  • バックグラウンドになるデーモンは管理できない。
  • この為、run から動作させるプロセスは、 & を付けてバックグラウンドにしないこと。

詳細は、オフィシャルサイトを参照。https://cr.yp.to/daemontools.html

今回は、Androidで動作するTermuxでdaemontoolsを動作させるように修正をしました。

インストール

daemontoolsは、展開したソースディレクトリにコマンドがシンボリック・リンクされます。

このインストール例では、ホームディレクトリに bin を作成し、そこに展開してインストールします。

$ mkdir bin
$ cd bin

$ git clone https://github.com/take-i/termux-daemontools.git
$ cd termux-daemontools/admin/daemontools-0.76/
$ package/install

インストールは以上で終了です! ビルドツールが入れてなくてmakeできない場合は、このように入れておいてください。

$ pkg install autoconf automake bison bzip2 \
              clang cmake coreutils diffutils \
              flex gawk git grep gzip libtool \
              make patch perl sed silversearcher-ag \
              tar termux-exec wget -y

コマンドはどこにあるの?

コマンドは、termux配下の $PREFIX/bin ディレクトリ以下にありますが、これはシンボリック・リンクです。

$ which svscan
/data/data/com.termux/files/usr/bin/svscan

また、このシンボリック・リンク先は、$PREFIX/command/ になります。

$ ls -l /data/data/com.termux/files/usr/bin/svscan
lrwxrwxrwx 1 u0_a257 u0_a257 46 Oct 21 15:10 /data/data/com.termux/files/usr/bin/svscan -> /data/data/com.termux/files/usr/command/svscan

つまり、コマンドの本体はビルドしたディレクトリ以下にあります。ビルドしたディレクトリを削除するときは注意しましょう。

$ tree $PREFIX/command/
├── envdir -> /data/data/com.termux/files/home/bin/termux-daemontools/admin/daemontools/command/envdir
├── envuidgid -> /data/data/com.termux/files/home/bin/termux-daemontools/admin/daemontools/command/envuidgid
├── fghack -> /data/data/com.termux/files/home/bin/termux-daemontools/admin/daemontools/command/fghack
├── multilog -> /data/data/com.termux/files/home/bin/termux-daemontools/admin/daemontools/command/multilog
├── pgrphack -> /data/data/com.termux/files/home/bin/termux-daemontools/admin/daemontools/command/pgrphack
├── readproctitle -> /data/data/com.termux/files/home/bin/termux-daemontools/admin/daemontools/command/readproctitle
├── setlock -> /data/data/com.termux/files/home/bin/termux-daemontools/admin/daemontools/command/setlock
├── setuidgid -> /data/data/com.termux/files/home/bin/termux-daemontools/admin/daemontools/command/setuidgid
├── softlimit -> /data/data/com.termux/files/home/bin/termux-daemontools/admin/daemontools/command/softlimit
├── supervise -> /data/data/com.termux/files/home/bin/termux-daemontools/admin/daemontools/command/supervise
├── svc -> /data/data/com.termux/files/home/bin/termux-daemontools/admin/daemontools/command/svc
├── svok -> /data/data/com.termux/files/home/bin/termux-daemontools/admin/daemontools/command/svok
├── svscan -> /data/data/com.termux/files/home/bin/termux-daemontools/admin/daemontools/command/svscan
├── svscanboot -> /data/data/com.termux/files/home/bin/termux-daemontools/admin/daemontools/command/svscanboot
├── svstat -> /data/data/com.termux/files/home/bin/termux-daemontools/admin/daemontools/command/svstat
├── tai64n -> /data/data/com.termux/files/home/bin/termux-daemontools/admin/daemontools/command/tai64n
└── tai64nlocal -> /data/data/com.termux/files/home/bin/termux-daemontools/admin/daemontools/command/tai64nlocal

daemontoolsの起動

必須ではありませんが、明示的にPATHを記載したい場合は以下のように追記しておきます。

~/.bashrc

::
#djb tool daemontools
export PATH=PATH:PREFIX/command

リモートシェルから、Daemontools の起動は、スマートフォンのroot化を行なっている場合は root で起動できます。その場合は、

$ nohup sudo svscan $PREFIX/service/ &

一般ユーザーで起動する場合は、

$ nohup svscan $PREFIX/service/ &

どちらかの方法で起動してください。なお、Termux:Boot の有償アプリを入れている場合は、~/.termux/boot/ 以下に以下のような起動スクリプトを記載しておくとスマホを再起動してホーム画面まで行った時に自動的に起動します。

#!/data/data/com.termux/files/usr/bin/sh

export PATH=PATH:HOME/bin
export PATH=PATH:PREFIX/command
export PREFIX=/data/data/com.termux/files/usr

sudo svscan $PREFIX/service/ &

設定のサンプル

例えば、crondをdaemontoolsで起動させるサンプルです。ホームディレクトリにbootディレクトリを作成して後から PREFIX/service/ にシンボリック・リンクを張って起動させます。以下の例では、実態のディレクトリはHOME/boot/ですが、どこでもOKです。$PREFIX/var/boot/ とか好きなところにディレクトリを作成してください。

$ cd
$ mkdir -p boot/crond
$ cd boot/crond

$ vi run
#!/bin/sh

export PATH=PATH:HOME/bin
export PATH=PATH:PREFIX/command
export PREFIX=/data/data/com.termux/files/usr

exec 2>&1
exec > /dev/null

# start up script example.
# need pkg install cronie
exec crond -n

デーモン起動しないように、crond を -n オプションでフォアグランドで起動しています。

$ cd ../
$ chmod +t crond

このようにスティッキービットをディレクトリに付けておきます。

起動

シンボリック・リンクを張ると起動します。

$ ln -s $HOME/boot/crond $PREFIX/service/

起動確認

ルートで、svscan を動作させている場合は以下のようにすれば svstatコマンドで確認できます。

$ tsu
# svstat $PREFIX/service/crond
/data/data/com.termux/files/usr/service/crond: up (pid 8704) 191 seconds

rootで動作させている場合は、プロセスツリーが以下のようになっています。

init─┬
   ::
     ├─magiskd─┬─logcat
     │         ├─sh───svscan─┬─supervise───run───sleep
     │         │             └─supervise───crond

つまり、Termuxを完全に落としてもcronは動き続けてくれます!

サービスの一時的な停止

$ svc -d $PREFIX/service/crond

サービスの再開

$ svc -u $PREFIX/service/crond

永続的なサービスの削除

監視ディレクトリからシンボリック・リンクを削除します。

$ cd $PREFIX/service/
$ unlink crond

注意事項

setuidgidなど、一般ユーザ(termuxをインストールしたユーザ)では動作しないと思います。また、すべてのコマンドをテストしていませんので、動作無保証です。テスト済みのコマンドは以下から確認できます。

Github:termux-daemontools

https://github.com/take-i/termux-daemontools/blob/master/readme-jp.md

まとめ

今回の要点は以下となります。

・daemontoolsは、Termuxでもなんとか動作させることができた
・root化されていないTermuxでも動作する
・root化されているスマホだと、Termuxをタスクから完全に落としても動作するデーモンを管理できる
・メリットとしては、root化されていない端末の場合、サービス起動管理が一元化できそう。
・setlockは、いろいろ使えそうなのでちゃんと動くか確認してみたい。

あとがき

一応、djbdnsもtermuxで動作させようとあれこれ弄っていたのですが、どうやらうまく動作させることができませんでした。Androidの起動管理がよくわかっていなくて、djbdnsを起動させるとメモリーがどんどん膨らみ、swapも使い果たして再起動してしまいます。これは、djbdnsの問題ではなく、おそらくandroidの起動するシステムが関連している感じですがよくわかっていません。

 当初の目的では、DNSを動作させることだったんですがこれは当分、違う方法でやることにします。

著者にメッセージ

間違いのご指摘など、コメントじゃなくて、個人的にやりとりしたい場合はこちらからどうぞ。お返事が遅くなるときもありますが、ご了承を。