linux下的守护进程(daemon)和系统日志(syslog)

  • 守护进程daemon

Unix/Linux中的守护进程(Daemon)类似于Windows中的后台服务进程,一直在后台长时间运行的进程。它通常在系统启动后就运行,没有控制终端,也无法和前台的用户交互,在系统关闭时才结束。Daemon程序一般都作为服务程序使用,等待客户端程序与它通信。我们也把运行的Daemon程序称作守护进程。比如的网络服务程序,可以在完成创建套接口,绑定套接口,设置套接口为监听模式后,变成守护进程进入后台执行而不占用控制终端,这是网络服务程序的常用模式。UNIX下的网络服务程序,如WebServer(Nginx、Apache等),FTP(vsftp),SSH(openssh)等一般都是由守护进程(Daemon)来实现的。守护进程不占用终端,在后台运行。UNIX的守护进程一般都命名为 *d 的形式,如httpd,vsftpd,sshd等。守护进程一旦脱离了终端,退出就成了问题,这时需要使用 ps 命令查出进程ID然后再使用kill命令停止。

Linux系统专门提供了一个用来创建daemon进程的库函数,该函数的原型是

#include <unistd.h>  //包含daemon头文件

int daemon(int nochdir, int noclose);
  • 参数

  1. nochdir

指定是否要切换当前工作路径到"/“根目录,

    2.noclose

指定是否要关闭标准输入、标准输出和标准出错(即重定向到/dev/null)。

  • 在创建守护进程的时候,往往需要将进程的工作目录修改为”/"根目录,并将标准输入、标准输出和标准出错关闭。所以这两个参数我们一般都是传0。

  • 编程示例

#ifndef __DAEMON_H__
#define __DAEMON_H__
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <syslog.h>
#include <libgen.h>

#endif

int main (int argc, char *argv[])
{

    char          *progname  = basename(argv[0]);
    if ( daemon(1,1) < 0) //实行daemon
    {
        printf("Program daemon failure:%s\n", strerror(errno));
        return -1;
    }

    openlog("daemon",LOG_CONS | LOG_PID,0);
    syslog(LOG_NOTICE, "program '%s' start running\n",progname);
    syslog(LOG_WARNING, "program '%s' running with a warnning message\n", progname);
    syslog(LOG_EMERG, "program '%s' running with a emergency message\n",progname);
    while (1)
    {
        //do something;

    }
    syslog(LOG_NOTICE, "program '%s' stop running\n", progname);
    closelog();

        return 0;
}
              
  • 我们可以在使用以下命令来查看daemon程序的信息
 ps -aux |grep daemon

  • 如果想要kill daemon这个程序:
killall daemon 
  • 日志系统syslog

syslog是一种工业标准的协议,可用来记录设备的日志。在UNIX系统,路由器、交换机等网络设备中,系统日志(System Log)记录系统中任何时间发生的大小事件。管理者可以通过查看系统记录,随时掌握系统状况。UNIX的系统日志是通过syslogd这个进程记录系统有关事件记录,也可以记录应用程序运作事件。通过适当的配置,我们还可以实现运行syslog协议的机器间通信,通过分析这些网络行为日志,藉以追踪掌握与设备和网络有关的状况。

  • 函数原型:

#include <syslog.h>      //需要包含头文件
void openlog(const char *ident, int option, int facility);  //打开系统日志
void syslog(int priority, const char *format, ...);         //写入日志系统
void closelog(void);                                         //关闭日志系统
  • openlog函数及其参数说明 (打开系统日志)

  • 参数说明:

1、ident:

     是一个标记,ident 所表示的字符串将固定的加在每行日志的前面一标识这个日志,通常就写成当前程序的名称以作标记。

扫描二维码关注公众号,回复: 9622999 查看本文章

 2、option:

    指定openlog函数和接下来调用的syslog函数的控制标志

option 说明
LOG_CONS 如果将信息发送给 syslogd 守护进程时发生错误,直接将相关信息输出到终端
LOG_NDELAY 立即打开与系统日志的连接(通常情况下,只有在产生第一条日志信息的情况下才会打开与日志系统的连接)
LOG_ODELAY 类似于 LOG_NDELAY 参数,与系统日志的连接只有在 syslog 函数调用时才会创建

LOG_PERROR

在将信息写入日志的同时,将信息发送到标准错误输出
LOG_PID 每条日志信息中都包含进程号

 3、facility:

指定记录消息程序的类型,与 syslogd 守护进程的配置文件 syslog.conf 中的 facility 对应。

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 本地使用保留
  • syslog函数及其参数说明 (写入日志,与文件系统调用 printf使用方法类似,但在前面指定日志级别。)

  • 参数说明

  • priority:

表示消息的级别,与 syslogd 守护进程的配置文件 syslog.conf 中的 level 对应。

LOG_EMERG 紧急情况
LOG_ALERT 应该被立即改正的问题,如系统数据库破坏
LOG_CRIT 重要情况,如硬盘错误
LOG_ERR 错误
LOG_WARNING 警告信息
LOG_NOTICE 不是错误情况,但是可能需要处理
LOG_INFO 情报错误
LOG_DEBUG 包含情报的信息,通常指在调试一个程序时使用
  • closelog函数(关闭当前打开日志系统)

函数说明:关闭日志设备,与文件系统调用的close类似;调用closelog也是可选择的,它只是关闭被用于与syslog守护进程通信的描述符。

  • 编程示例

#ifndef __DAEMON_H__
#define __DAEMON_H__
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <syslog.h>
#include <libgen.h>

#endif

int main (int argc, char *argv[])
{

    char          *progname  = basename(argv[0]);
    if( daemon(1,1) < 0)
    {
        printf("Program daemon failure:%s\n", strerror(errno));
        return -1;
    }

    openlog("daemon",LOG_CONS | LOG_PID,0);   //打开日志系统
    syslog(LOG_NOTICE, "program '%s' start running\n",progname);   //写入日志信息
    syslog(LOG_WARNING, "program '%s' running with a warnning message\n", progname);
    syslog(LOG_EMERG, "program '%s' running with a emergency message\n",progname);
    while (1)
    {
        //do something;

    }
    syslog(LOG_NOTICE, "program '%s' stop running\n", progname);
    closelog();  //关闭日志系统

        return 0;
}
              
  • 我们可以在使用以下命令来查看写入到系统日志的信息,
vim /var/log/syslog
  • 运行程序写入日志系统的内容(由于Linux 实行的时日志回滚系统,我们写入的信息一般在最后)

发布了17 篇原创文章 · 获赞 10 · 访问量 944

猜你喜欢

转载自blog.csdn.net/qq_44045338/article/details/104697989