前置准备
首先,创建一个简单的守护进程。以下是守护进程初始化代码(init_daemon.c):
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
void init_daemon() {
pid_t pid = fork();
if (pid > 0) exit(0);
if (pid < 0) {
perror("子进程创建失败");
exit(1);
}
setsid();
chdir("/");
umask(0);
for (int fd = 0; fd < sysconf(_SC_OPEN_MAX); ++fd) {
close(fd);
}
}
接着,编写测试文件(daemon_test.c)用于验证守护进程是否正常运行:
#include <stdio.h>
#include <time.h>
void init_daemon();
int main() {
FILE *log_file;
time_t current_time;
init_daemon();
while (1) {
sleep(5);
if ((log_file = fopen("daemon.log", "a")) != NULL) {
current_time = time(NULL);
fprintf(log_file, "守护进程正在运行,当前时间:%s", ctime(¤t_time));
fclose(log_file);
}
}
return 0;
}
实验结果如下所示:
第一种方式:通过rc.local实现自启动
在`/etc/rc.local`文件的最后一行添加以下内容(确保路径为绝对路径):
/home/user/code/daemon_test
保存后重启系统即可实现守护进程的自动启动。
第二种方式:通过服务脚本实现自启动
步骤如下:
- 编写服务启动脚本(例如`my_service.sh`):
#!/bin/bash
# my_service - 启动和停止守护进程的脚本
# chkconfig: 2345 90 10
# description: 守护进程服务
DAEMON_PATH="/home/user/code/daemon_test"
PID_FILE="/var/run/daemon_test.pid"
if [ ! -x "$DAEMON_PATH" ]; then
echo "错误:守护进程二进制文件 $DAEMON_PATH 不存在或不可执行"
exit 1
fi
start() {
echo "正在启动守护进程..."
nohup $DAEMON_PATH > /dev/null 2>&1 &
echo $! > $PID_FILE
echo "守护进程已启动。"
}
stop() {
if [ -f "$PID_FILE" ]; then
PID=$(cat $PID_FILE)
echo "正在停止守护进程(PID:$PID)..."
kill $PID
rm -f $PID_FILE
echo "守护进程已停止。"
else
echo "守护进程未运行。"
fi
}
restart() {
stop
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
echo "用法:service my_service {start|stop|restart}"
exit 1
esac
exit 0
- 设置脚本权限:
chmod +x /path/to/my_service.sh
- 将脚本复制到`/etc/init.d/`目录:
cp /path/to/my_service.sh /etc/init.d/my_service
- 注册服务:
chkconfig --add my_service
chkconfig my_service on
- 重启系统并验证守护进程是否自启:
ps aux | grep daemon_test