Linux C 守护进程daemon与系统日志syslog

目录

Deamon进程

syslog

Ubuntu Linux找不到/var/log/messages解决方法

代码示例


Deamon进程

#include <unistd.h>
int daemon(int nochdir, int noclose);

功能描述:使进程在后台运行,不会随着terminal的退出而结束。一般作为服务器程序使用,等待客户端与其通信
参数说明:①nochdir指定是否要切换当前工作路径到”/”根路径
                  ②noclose指定是否要关闭标准输入、标准输出和标准出错(即重定向到/dev/null)
返回值:成功返回0,失败则返回-1


PS:在创建守护进程的时候,一般需要将进程的工作目录修改为”/”根目录,并关闭标准输入、标准输出和标准出错,故这两个参数一般都传0
注:在Linux命令中,在make后面加后台运行符(&)可以让该命令在后态运行,但是这只是造成make在后台一直运行的假象,其实他并没有摆脱和terminal之间的父子关系。当terminal退出后,make依然会退出。



syslog


对于在后台默默运行的守护进程,本身不应该往标准输出或标准出错上输出程序运行的任何状态信息,我们也一般会关闭三个标准I/O,那么程序的运行状态信息该如何查看呢?当然我们可以自己写函数把程序运行的而相关信息记录到文件中,另外一种方式就是使用Linux系统自带的syslog日志机制。syslog是一种工业标准的协议,可用来记录设备的日志。系统日志(System Log)记录系统中任何时间发生的大小事件。管理者可以通过查看系统记录,随时掌握系统状况。UNIX的系统日志是通过syslogd这个进程(也是一个守护进程)记录系统有关事件记录。下面是Linux系统系统自带的日志系统相关函数:

#include <syslog.h> 
void openlog(const char *ident, int option, int facility);

功能描述:打开日志设备,以供读取和写入,与文件系统调用的open类似;调用openlog是可选择的。如果不调用openlog,则在第一次 调用syslog时,自动调用openlog。

无返回值 
参数说明: 
①ident:是一个标记,ident 所表示的字符串将固定的加在每行日志的前面一标识这个日志,通常就写成当前程序的名称作标记。 
②option: 指定openlog函数和接下来调用的syslog函数的控制标志。可以取以下值: 
LOG_CONS 如果将信息发送给 syslogd 守护进程时发生错误,直接将相关信息输出到终端 
LOG_NDELAY 立即打开与系统日志的连接(通常情况下,只有在产生第一条日志信息的情况下才会打开与日志系统的连接) 
LOG_ODELAY 类似于LOG_NDELAY参数,与系统日志的连接只有在syslog函数调用时才会创建 
LOG_PERROR 在将信息写入日志的同时,将信息发送到标准错误输出 
LOG_PID 每条日志信息中都包含进程号 
③facility:指定记录消息程序的类型,与syslogd守护进程的配置文件syslog.conf中的facility对应。可取如下值: 
LOG_AUTH 认证系统(login、su、getty等) 
LOG_AUTHPRIV 同 LOG_AUTH 但只登陆到所选择的单个用户可读的文件中。 
LOG_CRON cron 守护进程 
LOG_DAEMON 其他系统守护进程,如 routed 
LOG_FTP 文件传输协议:ftpd、tftpd 
LOG_KERN 内核产生的消息 
LOG_LPR 系统打印机缓冲池:lpr、lpd 
LOG_MAIL 电子邮件系统 
LOG_NEWS 网络新闻系统 
LOG_SYSLOG 由 syslogd(8)产生的内部消息 
LOG_USER 随机用户进程产生的消息 
LOG_UUCP UUCP 子系统 
LOG_LOCAL0 ~ LOG_LOCAL7 本地使用保留 

注:当facility值为0时,代表默认情况,无特殊指定,一般我们将其设为0。

#include <syslog.h>
void syslog(int priority, const char *format, ...); 

功能描述:写入日志,与文件系统调用 printf使用方法类似,但在前面指定日志级别。

无返回值 
参数说明: 
①priority:表示消息的级别,与syslogd守护进程的配置文件syslog.conf中的level对应。可取如下值: 
LOG_EMERG 紧急情况,会直接发送到终端 
LOG_ALERT 应该被立即改正的问题,如系统数据库破坏 
LOG_CRIT 重要情况,如硬盘错误 
LOG_ERR 错误 
LOG_WARNING 警告信息,不会发送到终端
LOG_NOTICE 不是错误情况,但是可能需要处理 
LOG_INFO 情报错误 
LOG_DEBUG 包含情报的信息,通常指在调试一个程序时使用 

#include <syslog.h>
void closelog(void); 

无返回值,无参数
功能描述:关闭日志设备,与文件系统调用的close类似;调用closelog也是可选择的,它只是关闭被用于与syslog守护进程通信的描述符


PS:所有程序(包括Linux内核)调用syslog()函数的输出相关信息都会记录到/var/log/messages日志文件中,因为该文件中记录了所有的信息,这也意味着当前程序记录的消息容易被别的程序冲刷掉,所以如果要需要检测特定程序的日志,则一般会使用标准文件IO库(fopen()、fwrite()等)自己实现日志系统,而不是直接调用系统自带的。


Ubuntu Linux找不到/var/log/messages解决方法

①下载rsyslog

 sudo apt install -y rsyslog

②修改/etc/rsyslog.d/50-default.conf文件内容,需要sudo权限将*.=info起的那四行注释注销

sudo vim /etc/rsyslog.d/50-default.conf

③重启rsyslog

 systemctl restart rsyslog


代码示例

下面通过一个程序将守护进程与系统日志一起使用起来。

 lyt598@ubuntu:~$ vim syslog.c

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <syslog.h>
#include <libgen.h> //basename()

int main(int argc, char **argv)
{
	char    *program;
	
	program = basename(argv[0]);
	openlog("daemon", LOG_CONS | LOG_PID, 0);

	if( daemon(0, 0) < 0 )
	{
		syslog(LOG_ERR, "%s create daemon() failure: %s\n", program, strerror(errno));
	}

	syslog(LOG_NOTICE, "%s create daemon() successfully.\n", program);
	syslog(LOG_WARNING, "%s running with a warning message.\n", program);

	closelog();
	return 0;
}

lyt598@ubuntu:~$ gcc syslog.c -o syslog
lyt598@ubuntu:~$ ./syslog

lyt598@ubuntu:~$ tail -2 /var/log/messages
Apr  8 23:26:32 ubuntu daemon[4783]: syslog create daemon() successfully.
Apr  8 23:26:32 ubuntu daemon[4783]: syslog running with a warning message.

注:tail命令可用于查看文件的内容 -2表示只显示两行

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值