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

2023-11-05

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

 

2020030616451810.png

  • 如果想要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 所表示的字符串将固定的加在每行日志的前面一标识这个日志,通常就写成当前程序的名称以作标记。

 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 实行的时日志回滚系统,我们写入的信息一般在最后)

20200306163910240.png

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 在 .gitconfig 中隐藏 GitHub 令牌

    我想将所有点文件存储在 GitHub 上 包括 gitconfig 这需要我将 GitHub 令牌隐藏在 gitconfig 中 为此 我有一个 gitconfig hidden token 文件 这是我打算编辑并放在隐藏令牌的 git 下
  • tcpdump 是否受 iptables 过滤影响?

    如果我的开发机器有iptables规则到FORWARD一些数据包 这些数据包是否被 tcpdump 捕获 我有这个问题 因为我知道存在其他链称为INPUT如果数据包路由到 它会过滤发往应用程序的数据包FORWARD链 它会到达吗tcpdum
  • Linux 上的 Pervasive ODBC 错误 [01000][unixODBC][驱动程序管理器]无法打开 lib '/usr/local/psql/lib/odbcci.so':找不到文件

    我正在尝试让 Pervasive v10 客户端 ODBC 在 Centos 6 上运行 据我所知 没有 64 位 ODBC 客户端 因此我必须使用 32 位客户端 我终于成功安装了它 但尝试使用时出现以下错误 isql v mydsn 0
  • 如何在linux中以编程方式获取dir的大小?

    我想通过 C 程序获取 linux 中特定目录的确切大小 我尝试使用 statfs path struct statfs 但它没有给出确切的大小 我也尝试过 stat 但它返回任何目录的大小为 4096 请建议我如何获取 dir 的确切大小
  • 为什么 fopen("any_path_name",'r') 不给出 NULL 作为返回值?

    在调试一些代码时 我得到如下内容 include
  • 内核的panic()函数是否完全冻结所有其他进程?

    我想确认内核的panic 功能和其他类似kernel halt and machine halt 一旦触发 保证机器完全冻结 那么 所有的内核和用户进程都被冻结了吗 是panic 可以被调度程序中断吗 中断处理程序仍然可以执行吗 用例 如果
  • 与 pthread 的进程间互斥

    我想使用一个互斥体 它将用于同步对两个不同进程共享的内存中驻留的某些变量的访问 我怎样才能做到这一点 执行该操作的代码示例将非常感激 以下示例演示了 Pthread 进程间互斥体的创建 使用和销毁 将示例推广到多个进程作为读者的练习 inc
  • 配置tomat的server.xml文件并自动生成mod_jk.conf

    我在用apache 2 2 15 and tomcat6 6 0 24 on CentOS 6 4并希望使用 tomcat 服务器的功能 通过添加以下内容自动生成 mod jk conf 文件
  • Intel 上的 gcc 中的 _mm_pause 用法

    我参考过这个网页 https software intel com en us articles benefitting power and performance sleep loops https software intel com
  • 在生产服务器上使用 Subversion 使文件生效的最佳方法是什么?

    目前我已经设置了 subversion 这样当我在 Eclipse PDT 中进行更改时 我可以提交更改 它们将保存在 home administrator 中项目文件 该文件具有 subversion 推荐的 branches tags
  • 绕过 dev/urandom|random 进行测试

    我想编写一个功能测试用例 用已知的随机数值来测试程序 我已经在单元测试期间用模拟对其进行了测试 但我也希望用于功能测试 当然不是全部 最简单的方法是什么 dev urandom仅覆盖一个进程 有没有办法做类似的事情chroot对于单个文件并
  • Linux 为一组进程保留一个处理器(动态)

    有没有办法将处理器排除在正常调度之外 也就是说 使用sched setaffinity我可以指示线程应该在哪个处理器上运行 但我正在寻找相反的情况 也就是说 我想从正常调度中排除给定的处理器 以便只有已明确调度的进程才能在那里运行 我还知道
  • 我什么时候应该编写 Linux 内核模块?

    有些人出于某种原因想要将 Linux 中的代码从用户空间移动到内核空间 很多时候 原因似乎是代码应该具有特别高的优先级 或者只是 内核空间更快 这对我来说似乎很奇怪 我什么时候应该考虑编写内核模块 有一套标准吗 我怎样才能激励将代码保存在
  • ansible unarchive 模块如何查找 tar 二进制文件?

    我正在尝试执行一个 ansible 剧本 该剧本的任务是利用unarchive模块 因为我是在 OSX 上执行此操作 所以我需要使用它gnu tar 而不是bsd tar通常与 OSX 一起提供 因为BSD tar 不受官方支持 https
  • 无法显示 Laravel 欢迎页面

    我的服务器位于 DigitalOcean 云上 我正在使用 Ubuntu 和 Apache Web 服务器 我的家用计算机运行的是 Windows 7 我使用 putty 作为终端 遵循所有指示https laracasts com ser
  • 嵌入式 Linux – 部署固件更新的机制? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在考虑在 Yocto 项目上开发一个嵌入式 Linux 项目 一个工业应用程序 我有几个问题想问那些有嵌入式 Linux 经验的人 Y
  • Linux下显卡内存使用情况

    Linux下有哪些工具可以监控显卡内存使用情况 NVIDIA 性能套件 http developer nvidia com content nvidia perfkit有Linux版本 可以实时监控各种显卡属性 包括显卡内存使用情况 显然
  • 如何在文件中搜索多行模式?

    我需要找到包含特定字符串模式的所有文件 我想到的第一个解决方案是使用find管道与xargs grep find iname py xargs grep e YOUR PATTERN 但是 如果我需要查找跨越多行的模式 我就会陷入困境 因为
  • 从核心转储中获取堆栈跟踪

    如何从核心转储文件中获取堆栈跟踪 该文件大约 14 mb 是在我的应用程序退出并显示 分段错误 后生成的 我使用的是红帽 5 5 gdb usr bin myapp binary corefile 然后 使用以下之一 gdb bt gdb
  • 在 C 中运行 setuid 程序的正确方法

    我有一个权限为4750的进程 我的Linux系统中存在两个用户 root 用户和 appz 用户 该进程继承以 appz 用户身份运行的进程管理器的权限 我有两个基本惯例 void do root void int status statu

随机推荐

  • 自底向上和自顶向下的架构设计区别

    某日小明上数学课 他的老师给了很多个不同的直角三角板让小明用尺子去量三角板的三个边 并将长度记录下来 两个小时过去 小明完成任务 把数据拿给老师 老师给他说 还有一个任务就是观察三条边之间的数量关系 又是两个小时 聪明的小明连蹦带跳走进了办
  • vue父组件向子组件传值

    非常简单 相信大家一看就懂 复制到浏览器即可使用 注意别忘了引入vue哦 div div pmsg div div
  • 一台计算机如何安装2个版本的python,互不影响呢

    python学习过程中 很多教程都是python2 版本的 但是python2 到2020年就不在维护了 所以 现在教大家如何在一台计算机上安装python2 和python3 互不影响 可以自如的切换 不用任何第三方软件 简单省力 一次配
  • 熊啸锋:掌握这4个步骤,你的销售额至少增加3倍,风险降低10倍

    你好 我是熊啸锋老师 认识我的人都知道 我有一套快速成交陌生客户的秘诀 让你在零粉丝的情况下 快速的冷启动 用好这个秘诀之后 在不增加成本的情况下 你的利润至少增加3倍 风险降低10倍 具体怎么做呢 在分享这个秘诀之前 我们先来看看大部分人
  • latex中长公式换行,很好的办法

    今天在编辑公式时 有一个公式很长 写到一行就出去了 当时之前换行都是方程组或者在括号完之后换 都没有问题 但是今天我也换行的是在括号中间断开 这样出现问题 编辑的时候会出错误提醒 上网查了一些论坛 也有人和我一样的问题 但是都没有解决方案
  • 操作系统存储器管理之连续、页式、段式、段页式存储器管理方式

    基本内存分配方案 4 3 连续分配存储管理方式 连续分配方式 是指为一个用户程序分配一个连续的内存空间 4 3 1单一连续分配 内存分为两个区域 系统区 用户区 应用程序装入到用户区 可使用用户区全部空间 最简单 适用于单用户 单任务的OS
  • 抖音帐号注册需要注意什么

    虽然短视频是大势所趋 但是我们在抖音上也不能瞎玩 注册时需要避开哪些坑 怎样才能更快的吸引到第一批粉丝 新手一定不要错过今天的课程干货 首先 你要记住账号注册一卡一号一手机新手在抖音账号注册 其次 简介中需要用简练的语言体现出账号的内容及特
  • 基于VirtualBox虚拟机安装Ubuntu图文教程

    一 下载安装VirtualBox 官网下载VirtualBox 目前版本 VirtualBox 5 1 8 for Windows hosts x86 amd64 下载好了安装VirtualBox 一路Next就可以了 这个比较简单 运行V
  • 创意特效分享:用代码绘制网页上的爱心

    在网页设计中 为了增加用户体验和吸引用户的注意力 常常需要添加一些特效来增添页面的互动性和趣味性 其中 爱心特效是一种常见且受欢迎的效果 能够在用户与网页进行交互时展现出迷人的动态效果 通过使用HTML CSS和JavaScript 我们可
  • MySQL - 表字段的唯一键约束

    设置表字段唯一约束 UNIQUE UK 当数据库表中某个字段上的内容不允许重复时 可以使用UK约束进行设置 UK约束在创建数据库时为某些字段加上 UNIQUE 约束条件 保证所有记录中该字段上的值不重复 如果在用户插入的记录中该字段上的值与
  • switch 语句,while 循环,for 循环和do while循环

    switch 语句 switch 语句是 种特殊形式的 if else 结构 于判断条件有多个结果的情况 它把多重的 else if 改成更易 可读性更好的形式 例如 include
  • Linux多线程:条件变量

    条件变量的类型 pthread cond t 作用 满足某个条件阻塞或者解除阻塞某个线程 int pthread cond init pthread cond t restrict cond const pthread condattr t
  • CTFweb篇——html源代码签到题

    0x00 前言 做CTF的web中Html查看源代码的题还是比较简单 对我而言 就是在源代码中找寻相关的关键字或者线索 0x01 签到题 进入靶场发现当前页面 最开始怀疑是靶场原因没进去 仔细研究后发现自己被障眼法了 初次做题的时候 在懵逼
  • java.lang.ArithmeticException: Division undefined 或者 java.lang.ArithmeticException: / by zero

    今天线上报了一个这样的错误 经过排查发现是因为对Bigdecimal类型做除法divide 运算时 除数为0导致的 加了一个非0的判断就好了 当我们的被除数为整型 short int long 时 除数不能为0 除数如果为double 即
  • npm install报错

    1 在安装sass时报错 C Users dong Downloads CapecAnalyzer master CapecAnalyzer master WebAppCapec node modules node sass src lib
  • IDEA2022性能优化的一些设置

    因为本人电脑配置比较低 导致IDEA用起来卡卡的 经过设置之后有所缓解 可以参考 我这里IDEA版本为 2022 1 2 注意区分版本 1 关掉没用的插件 IDEA预装的插件是很多的 有很多都用不上 比如说新版本会有 code with m
  • tcp port numbers reused出现原因_图文并茂详解TCP的3次握手+4次挥手+11种状态集

    2TCP的介绍 TCP也叫传输控制协议 Transmission Control Protocol 是一种面向连接的 可靠的 基于字节流的传输层通信协议 由IETF的RFC 793定义 3TCP的特点1 面向连接 TCP通信需要经过创建连接
  • 接口测试详细步骤(入门+实用)

    1 拿到接口文档的时候先分析文档 分析的内容有 请求类型 必填项 选填项 入参 出参及描述 2 编写测试用例 测试用例的编写参考下图 3 利用postman jmeter或者其它接口测试工具执行测试用例 4 把测试后的的响应数据与数据库中自
  • 【StyleGAN2论文精读CVPR_2020】Analyzing and Improving the Image Quality of StyleGAN

    StyleGAN2论文精读CVPR 2020 Analyzing and Improving the Image Quality of StyleGAN 一 前言 Abstract 1 Introduction 2 Removing nor
  • linux下的守护进程(daemon)和系统日志(syslog)

    目录 守护进程daemon 参数 编程示例 日志系统syslog 函数原型 openlog函数及其参数说明 打开系统日志 参数说明 参数说明 编程示例 守护进程daemon Unix Linux中的守护进程 Daemon 类似于Window