以下是一个使用systemd创建守护进程的示例,假设我们要创建一个简单的守护进程,它每隔一定时间就将当前时间写入到一个日志文件中。
1. 编写守护进程代码
首先,创建一个名为 mydaemon.c
的C语言文件,内容如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#define LOG_FILE "/var/log/mydaemon.log"
void write_current_time_to_log() {
FILE *fp;
time_t now;
struct tm *tm_info;
// 打开日志文件,如果不存在则创建
fp = fopen(LOG_FILE, "a");
if (fp == NULL) {
perror("fopen");
exit(1);
}
// 获取当前时间
now = time(NULL);
tm_info = localtime(&now);
// 将当前时间格式化为字符串并写入日志文件
fprintf(fp, "Current time: %s", asctime(tm_info));
// 关闭日志文件
fclose(fp);
}
int main() {
while (1) {
write_current_time_to_log();
sleep(60); // 每隔60秒写入一次时间
}
return 0;
}
这段代码实现了一个简单的循环,每隔60秒就获取当前时间并将其写入到指定的日志文件 /var/log/mydaemon.log
中。
2. 编译守护进程代码
使用以下命令编译 mydaemon.c
文件:
gcc mydaemon.c -o mydaemon
这将生成一个名为 mydaemon
的可执行文件。
3. 创建systemd单元文件
接下来,创建一个名为 mydaemon.service
的systemd单元文件,将其放置在 /etc/systemd/system/
目录下。内容如下:
[Unit]
Description=My Daemon Service
After=network.target
[Service]
ExecStart=/usr/local/bin/mydaemon
WorkingDirectory=/usr/local/bin/
Restart=always
User=root
Group=root
[Install]
WantedBy=multi-user.target
在这个单元文件中:
[Unit]
部分:Description
描述了这个服务的名称和用途。After=network.target
表示这个服务应该在网络服务启动之后启动。
[Service]
部分:ExecStart
定义了守护进程的启动命令,这里指向我们编译好的可执行文件/usr/local/bin/mydaemon
。WorkingDirectory
指定了守护进程的工作目录为/usr/local/bin/
。Restart=always
表示如果守护进程意外退出,systemd将总是重新启动它。User=root
和Group=root
设定了运行这个守护进程的用户和组为root
。
[Install]
部分:WantedBy=multi-user.target
说明这个服务应该在多用户模式下启动。
4. 启用和启动服务
完成单元文件的创建后,使用以下systemd命令来启用并启动这个服务:
systemctl enable mydaemon.service
systemctl start mydaemon.service
systemctl enable
命令会在系统启动时自动启动这个服务,而 systemctl start
命令则立即启动这个服务。
5. 查看服务状态
可以使用以下命令查看服务的状态:
systemctl status mydaemon.service
这将显示服务的当前运行状态,包括是否正在运行、最近一次启动时间、是否有错误等信息。
通过以上步骤,我们就成功地使用systemd创建并启动了一个守护进程。