目录
Deamon进程
syslog
Ubuntu Linux找不到/var/log/messages解决方法
代码示例
#include
int daemon(int nochdir, int noclose);
功能描述:使进程在后台运行,不会随着terminal的退出而结束。一般作为服务器程序使用,等待客户端与其通信
参数说明:①nochdir指定是否要切换当前工作路径到”/”根路径
②noclose指定是否要关闭标准输入、标准输出和标准出错(即重定向到/dev/null)
返回值:成功返回0,失败则返回-1
PS:在创建守护进程的时候,一般需要将进程的工作目录修改为”/”根目录,并关闭标准输入、标准输出和标准出错,故这两个参数一般都传0
注:在Linux命令中,在make后面加后台运行符(&)可以让该命令在后态运行,但是这只是造成make在后台一直运行的假象,其实他并没有摆脱和terminal之间的父子关系。当terminal退出后,make依然会退出。
对于在后台默默运行的守护进程,本身不应该往标准输出或标准出错上输出程序运行的任何状态信息,我们也一般会关闭三个标准I/O,那么程序的运行状态信息该如何查看呢?当然我们可以自己写函数把程序运行的而相关信息记录到文件中,另外一种方式就是使用Linux系统自带的syslog日志机制。syslog是一种工业标准的协议,可用来记录设备的日志。系统日志(System Log)记录系统中任何时间发生的大小事件。管理者可以通过查看系统记录,随时掌握系统状况。UNIX的系统日志是通过syslogd这个进程(也是一个守护进程)记录系统有关事件记录。下面是Linux系统系统自带的日志系统相关函数:
#include
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
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
void closelog(void);
无返回值,无参数
功能描述:关闭日志设备,与文件系统调用的close类似;调用closelog也是可选择的,它只是关闭被用于与syslog守护进程通信的描述符
PS:所有程序(包括Linux内核)调用syslog()函数的输出相关信息都会记录到/var/log/messages日志文件中,因为该文件中记录了所有的信息,这也意味着当前程序记录的消息容易被别的程序冲刷掉,所以如果要需要检测特定程序的日志,则一般会使用标准文件IO库(fopen()、fwrite()等)自己实现日志系统,而不是直接调用系统自带的。
①下载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
#include
#include
#include
#include
#include //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表示只显示两行