プロセスをdaemon化してみる


こんにちは。masuyamaです。
またもストックがなくなったのでC言語ネタに逃避します。

「djb先生のdaemontoolsがあるからdaemon化なんて不要」といきがっていた時代が私にもありました。
時代はめぐり、今はdaemon()関数がLinux環境にも導入され、お手軽にdaemon化ができるようになっています。

まずは普通にプロセスを作る

#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    while (1) {
        printf("running.\n");
        sleep(10);
    }
    exit(0);
}

実行してみます。

$ gcc -Wall -Werror sample.c
$ ./a.out
running.
running.
running.
running.
running.
running.

10秒毎にprintするだけのプロセスが起動しました。

ps コマンドで状態を見て見ます

masuyama 5636 1618 0 15:34 pts/36 00:00:00 /bin/bash
masuyama 9839 5636 0 15:55 pts/36 00:00:00 ./a.out

bashの子プロセスとして動作しています。

/procの情報もみてみます

 # ls -l /proc/6525/cwd
 lrwxrwxrwx 1 masuyama masuyama 0 Jul 3 15:43 /proc/6525/cwd -> /home/masuyama
 # ls -l /proc/6525/fd
 lrwx------ 1 masuyama masuyama 64 Jul 3 15:44 0 -> /dev/pts/36
 lrwx------ 1 masuyama masuyama 64 Jul 3 15:44 1 -> /dev/pts/36
 lrwx------ 1 masuyama masuyama 64 Jul 3 15:42 2 -> /dev/pts/36

当たり前なんですが、ターミナルを標準入出力とするプロセスが普通に動いているだけです。

daemon化してみる

daemon()を使用してdaemon化してみます。
この関数の詳細はこちらを参照してください。

#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    if (daemon(0, 0) != 0) {
        fprintf(stderr, "daemonize failed\n");
        exit(1);
    }
    
    while (1) {
        printf("running.\n");
        sleep(10);
    }
    exit(0);
}

4行のコードを追加しました。

実行してみます。

$ ./a.out
$

何も起こっていないように見えます。

psでプロセスをみてみます。

masuyama 10114 1 0 15:57 ? 00:00:00 ./a.out

親を持たないプロセス(initが親)として実行されています。

プロセスの情報も見てみます。

 # ls -l /proc/10114/cwd
 lrwxrwxrwx 1 masuyama masuyama 0 Jul 3 15:58 /proc/10114/cwd -> /
 # ls -l /proc/10114/fd
 lrwx------ 1 masuyama masuyama 64 Jul 3 15:59 0 -> /dev/null
 lrwx------ 1 masuyama masuyama 64 Jul 3 15:59 1 -> /dev/null
 lrwx------ 1 masuyama masuyama 64 Jul 3 15:59 2 -> /dev/null

実行ディレクトリはrootに、標準入出力、エラー出力は /dev/null に(無効に)なっています。

まとめ

いかがでしたでしょうか?
いつのまにか時代は forkして、setsidして、chdirして、/dev/null を openして、dupして、なんてことをやらなくてもよくなっていました。
お気軽にdaemonを書けるいい時代になりました。これからもいろいろなdaemonを生み出していきたいと思います。

スマートエデュケーションではdaemonを量産したいエンジニアの方を募集しています。
ご興味のある方は、こちらから応募ください。