【C言語】単純なTCPサーバをdemontoolsでデーモン化する【demontools】

C 言語で単純な TCP サーバを作って demontools でデーモン化してみます。
※ demontools を使う機会があったので備忘録を兼ねています。

TCPサーバ

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main(){
        int sockfd, sock_size, sock;
        struct sockaddr_in server;
        struct sockaddr_in client;

        /* ソケット作成 */
        sockfd = socket(AF_INET, SOCK_STREAM, 0);

        server.sin_family = AF_INET;
        server.sin_port = htons(8888);
        server.sin_addr.s_addr = INADDR_ANY;

        /* ソケットにポート番号割り当て */
        bind(sockfd, (struct sockaddr *)&server, sizeof(server));

        /* 割り当てたポート番号へ接続が作成できることをシステムに伝える */
        listen(sockfd, 5);

        /* 接続要求を受ける度にソケットを新しく取得 */
        while(1){
                sock_size = sizeof(client);
                sock = accept(sockfd, (struct sockaddr *)&client, &sock_size);
                write(sock, "TEST\n", 5);
                /* クライアントとの接続をクローズ */
                close(sock);
        }
        close(sockfd);
        return 0;
}

エラー処理は省いています。
適当なディレクトリにコンパイルしてください。
# ディレクトリ移動
cd /usr/local/bin
vi main.c
===================
*上記コード
===================
# コンパイル
gcc main.c -o simple-server

demontools

demontools の設定です。

# demontoolsの導入
mkdir -p /package
chmod 1755 /package
cd /package
wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz
gunzip daemontools-0.76.tar
tar -xpf daemontools-0.76.tar
rm -f daemontools-0.76.tar
cd admin/daemontools-0.76
cd src/

# ヘッダファイル修正
vi error.h
=======================
extern int errno;

↓

#include <errno.h>
=======================

# インストール
cd ..
package/install

# centos7 では使用しないのでコメントアウト
vi /etc/inittab
=======================
#SV:123456:respawn:/command/svscanboot
=======================

# サービスファイル作成
vi /etc/systemd/system/demontools.service
======================================================
[Unit]
Description=run demontools during boot
After=network.target

[Service]
User=root
Group=root
Type=simple
RemainAfterExit=yes
ExecStart=/command/svscanboot
Restart=always
LimitNOFILE=20480

[Install]
WantedBy=multi-user.target
======================================================


# プロセスのデーモン化
mkdir /service/simple-server/
vi /service/simple-server/run
======================================================
#!/bin/sh

exec /usr/local/bin/simple-server
======================================================

# ログ出力設定
mkdir /service/simple-server/log/
mkdir /var/log/simple-server
vi /service/simple-server/log/run
==============================================
#!/bin/sh

exec /usr/local/bin/multilog t /var/log/simple-server
==============================================

# 権限変更
chmod 755 /service/simple-server/run
chmod 755 /service/simple-server/log/run

# demontools 起動/自動起動設定
systemctl start demontools
systemctl enable demontools

【シェルスクリプト】だいたいのサーバ情報を取得する便利スクリプト【サーバ移設】

取り敢えずこのスクリプトを実行すれば、ある程度のサーバ情報を取得できるよ、ってだけのスクリプトです。

#!/bin/sh

# 情報取得関数
function addinfo(){

	# 情報を出力するファイル名を定義
	OUTPUT=serverinfo-`hostname`.txt
	# 情報内容を出力
	echo "####### $1 #########" >> $OUTPUT
	# コマンド結果を出力
	$2 >> $OUTPUT
	
	return 0
}

# ホストネーム
addinfo hostname "hostname"
# プロセス一覧
addinfo process-list "ps auxwwf"
# Listenポート一覧
addinfo listen-port "sudo netstat -lntp"
# ルートテーブル
addinfo route-table "sudo netstat -rn"
# rpmパッケージ
addinfo rpm-package "sudo rpm -qa | sort"
# 自動起動リスト
addinfo chkconfig "sudo chkconfig --list"
# OSバージョン
addinfo os-version "cat /etc/redhat-release"
# CPU
addinfo cpu-info "cat /proc/cpuinfo"
# メモリ
addinfo memory-info "free -m"
# ディスク
addinfo disk-info "df -hT"
# fstab
addinfo fstab "cat /etc/fstab"
# iptables
addinfo iptables "sudo service iptables status"
# ifconfig
addinfo ifconfig "ifconfig"