守护进程使用syslog函数打印信息(基于ARM-Linux)

从单板到集群:RK3588 ARM服务器架构设计与实战部署指南 在边缘计算和轻量级服务器领域,ARM架构以其高能效比和并行处理能力,正成为x86架构的重要补充。其核心原理在于通过精简指令集和高度集成的SoC设计,在单位功耗下提供更高的计算密度。这一技术价值在需要密集、并行处理且对功耗敏感的场景中尤为突出,例如多路视频分析、AI推理网关和云手机等应用。RK3588作为一款高性能ARM SoC,集成了强大的CPU、GPU和NPU,特别适合构建高密度计算集群。本文聚焦于利用RK3588构建专用服务器平台,深入探讨其硬件架构设计、从Bootloader到操作系统的软件栈搭建、以 阅读详情

本文将描述在使用inetd守护进程时,如何通过syslog函数打印消息到日志文件。

为什么需要这样做呢?根据《UNIX网络编程 卷1:套接字联网API》一书第13章的描述:由于守护进程没有控制终端,它们不能把消fprintf到stderr上。

从守护进程中登记消息的常用技巧就是调用syslog函数。

而sysolog函数需要syslogd服务的支持。因此在编译busybox时需要使能syslogd。



Linux系统启动后,需要打开syslogd服务。先来看看syslogd的命令选项:

[cpp]  view plain  copy
  1. [root@BGM /]#syslogd -h  
  2. syslogd: invalid option -- 'h'  
  3. BusyBox v1.16.0 (2013-04-15 16:07:27 CST) multi-call binary.  
  4.   
  5. Usage: syslogd [OPTIONS]  
  6.   
  7. System logging utility.  
  8. Note that this version of syslogd ignores /etc/syslog.conf.  
  9.   
  10. Options:  
  11.         -n              Run in foreground  
  12.         -O FILE         Log to given file (default:/var/log/messages)  
  13.         -l n            Set local log level  
  14.         -S              Smaller logging output  
  15.         -s SIZE         Max size (KB) before rotate (default:200KB, 0=off)  
  16.         -b N            N rotated logs to keep (default:1, max=99, 0=purge)  
  17.         -R HOST[:PORT]  Log to IP or hostname on PORT (default PORT=514/UDP)  
  18.         -L              Log locally and via network (default is network only if -R)  
  19.         -D              Drop duplicates  
  20.         -C[size(KiB)]   Log to shared mem buffer (read it using logread)  

这里我们注意到该syslogd不支持/etc/syslog.conf文件。

我们需要使用-L选项,让消息输出到本地(locally),其次其默认的本地输出文件为/var/log/message,

如果要修改输出文件,则使用-O选项。

因此,我这里使用的syslogd命令如下:

/sbin/syslogd -L

这里建议将该命令添加到系统的启动脚本中。

为了测试函数需要编写一个简单的TCP服务器程序和相应的客户程序,参照《UNIX网络编程 卷1:套接字联网API》的13.6小结编写测试用例,

程序如下:

服务器程序:

[cpp]  view plain  copy
  1. int main(void)  
  2. {  
  3.     socklen_t len;  
  4.     struct sockaddr *cliaddr;  
  5.     char buf[MAX_TCPSERV_BUF];  
  6.   
  7.     int ret, tmp;  
  8.   
  9.     openlog("bgmtcpserv", LOG_PID, 0);  
  10.   
  11.     dc = malloc(sizeof(struct data_content));  
  12.     if(!dc){  
  13.         perror("Unable to malloc data_content ");  
  14.         exit -1;  
  15.     }  
  16.   
  17.     cliaddr = malloc(sizeof(struct sockaddr_storage));  
  18.     if(!cliaddr){  
  19.         perror("Unable to malloc sockaddr_storage ");  
  20.         exit -1;  
  21.     }  
  22.   
  23.     len = sizeof(struct sockaddr_storage);  
  24.     if (getpeername(0, cliaddr, &len) == -1){  
  25.         perror("Getpeername error ");  
  26.         exit -1;  
  27.     }  
  28.       
  29.     syslog(LOG_USER|LOG_ALERT, "Connecting from %s\n", Sock_ntop(cliaddr,len));  
  30.       
  31.     close(0);   
  32.     closelog();  
  33.     exit(0);  
  34. }  
  35. /* include sock_ntop */  
  36. char *  
  37. sock_ntop(const struct sockaddr *sa, socklen_t salen)  
  38. {  
  39.     char        portstr[8];  
  40.     static char str[128];        /* Unix domain is largest */  
  41.   
  42.     switch (sa->sa_family) {  
  43.     case AF_INET: {  
  44.         struct sockaddr_in    *sin = (struct sockaddr_in *) sa;  
  45.   
  46.         if (inet_ntop(AF_INET, &sin->sin_addr, str, sizeof(str)) == NULL)  
  47.             return(NULL);  
  48.         if (ntohs(sin->sin_port) != 0) {  
  49.             snprintf(portstr, sizeof(portstr), ":%d", ntohs(sin->sin_port));  
  50.             strcat(str, portstr);  
  51.         }  
  52.         return(str);  
  53.     }  
  54. /* end sock_ntop */  
  55.   
  56. #ifdef    IPV6  
  57.     case AF_INET6: {  
  58.         struct sockaddr_in6    *sin6 = (struct sockaddr_in6 *) sa;  
  59.   
  60.         str[0] = '[';  
  61.         if (inet_ntop(AF_INET6, &sin6->sin6_addr, str + 1, sizeof(str) - 1) == NULL)  
  62.             return(NULL);  
  63.         if (ntohs(sin6->sin6_port) != 0) {  
  64.             snprintf(portstr, sizeof(portstr), "]:%d", ntohs(sin6->sin6_port));  
  65.             strcat(str, portstr);  
  66.             return(str);  
  67.         }  
  68.         return (str + 1);  
  69.     }  
  70. #endif  
  71. /* 
  72. #ifdef    AF_UNIX 
  73.     case AF_UNIX: { 
  74.         struct sockaddr_un    *unp = (struct sockaddr_un *) sa; 
  75.  
  76.              OK to have no pathname bound to the socket: happens on 
  77.                every connect() unless client calls bind() first.  
  78.         if (unp->sun_path[0] == 0) 
  79.             strcpy(str, "(no pathname bound)"); 
  80.         else 
  81.             snprintf(str, sizeof(str), "%s", unp->sun_path); 
  82.         return(str); 
  83.     } 
  84. #endif*/  
  85.   
  86. // #ifdef    HAVE_SOCKADDR_DL_STRUCT  
  87. //     case AF_LINK: {  
  88. //         struct sockaddr_dl    *sdl = (struct sockaddr_dl *) sa;  
  89.   
  90. //         if (sdl->sdl_nlen > 0)  
  91. //             snprintf(str, sizeof(str), "%*s (index %d)",  
  92. //                      sdl->sdl_nlen, &sdl->sdl_data[0], sdl->sdl_index);  
  93. //         else  
  94. //             snprintf(str, sizeof(str), "AF_LINK, index=%d", sdl->sdl_index);  
  95. //         return(str);  
  96. //     }  
  97. // #endif  
  98.     default:  
  99.         snprintf(str, sizeof(str), "sock_ntop: unknown AF_xxx: %d, len %d",  
  100.                  sa->sa_family, salen);  
  101.         return(str);  
  102.     }  
  103.     return (NULL);  
  104. }  
  105.   
  106. char *  
  107. Sock_ntop(const struct sockaddr *sa, socklen_t salen)  
  108. {  
  109.     char    *ptr;  
  110.   
  111.     if ( (ptr = sock_ntop(sa, salen)) == NULL)  
  112.         perror("sock_ntop error");    /* inet_ntop() sets errno */  
  113.     return(ptr);  
  114. }  

客户端程序:

[cpp]  view plain  copy
  1. #define SERV_PORT 30001  
  2. #define SERVIPADDR "192.168.0.200"  
  3.   
  4. ssize_t                     /* Read "n" bytes from a descriptor. */  
  5. readn(int fd, void *vptr, size_t n)  
  6. {  
  7.     size_t  nleft;  
  8.     ssize_t nread;  
  9.     char    *ptr;  
  10.   
  11.     ptr = vptr;  
  12.     nleft = n;  
  13.     while (nleft > 0) {  
  14.         if ( (nread = read(fd, ptr, nleft)) < 0) {  
  15.             if (errno == EINTR)  
  16.                 nread = 0;      /* and call read() again */  
  17.             else  
  18.                 return(-1);  
  19.         } else if (nread == 0)  
  20.             break;              /* EOF */  
  21.   
  22.         nleft -= nread;  
  23.         ptr   += nread;  
  24.     }  
  25.     return(n - nleft);      /* return >= 0 */  
  26. }  
  27.   
  28. int main(void)  
  29. {  
  30.     int sockfd, ret;  
  31.     struct sockaddr_in  servaddr;  
  32.     int n;  
  33.     char buf[512] ;  
  34.       
  35.     sockfd = socket(AF_INET, SOCK_STREAM, 0);  
  36.     if(sockfd < 0){  
  37.         perror("Socket error");  
  38.         return -1;  
  39.     }  
  40.       
  41.     memset(&servaddr, 0, sizeof(struct sockaddr_in));  
  42.     //bzero(&servaddr, sizeof(servaddr));  
  43.     servaddr.sin_family = AF_INET;  
  44.     servaddr.sin_port = htons(SERV_PORT);  
  45.     ret = inet_pton(AF_INET, SERVIPADDR, &servaddr.sin_addr);  
  46.     if(ret < 1){  
  47.         perror("Inet_pton error");  
  48.         return -1;  
  49.     }  
  50.   
  51.     ret = connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));  
  52.     if(ret < 0){  
  53.         perror("Connect error");  
  54.         return -1;  
  55.     }  
  56.   
  57.     close(sockfd);  
  58. }  

服务器程序编写完以后,为了让inetd能够调用我们的服务器程序,需要修改配置文件。

首先,修改/etc/services,增加如下:

mytcpser        30001/tcp                        # Used by BGM

其次,修改/etc/inetd.conf,增加如下:

mytcpser stream tcp nowait root /home/bgm/bgmtcpser bgmtcpser

这里的mytcpser需要和services文件中的第一个字段相同,其次/home/bgm/bgmtcpser为服务器程序所在的路径。

修改完配置文件后,将服务器程序bgmtcpser复制到/home/bgm目录下。

使用netstat 来查看是否inetd已经创建端口号为30001的监听套接字:

[cpp]  view plain  copy
  1. [root@BGM /]#netstat -an | grep 30001  
  2.   
  3. tcp        0      0 0.0.0.0:30001           0.0.0.0:*               LISTEN     

然后我们执行客户程序cli,执行完以后我们查看/var/log/messages中的内容:
[cpp]  view plain  copy
  1. Jul 23 13:13:42 BGM user.alert bgmtcpserv[2587]: Connecting from 192.168.0.200:40571  

这里的"Connecting from。。。"正是由syslog函数打印的。
ARM设备Docker实战:从安装到多架构镜像构建完整指南 容器化技术通过将应用及其依赖打包成标准单元,实现了环境的一致性与高效部署。其核心原理在于利用操作系统级虚拟化,在共享内核上创建隔离的进程空间。这一技术为现代软件交付带来了巨大价值,尤其在持续集成、微服务架构和云原生场景中至关重要。随着边缘计算和物联网的兴起,资源受限的ARM架构设备(如树莓派)也成为重要的部署目标。然而,跨架构部署常面临镜像兼容性挑战,例如在树莓派3B+等设备上直接运行x86镜像会导致失败。本文聚焦于ARM平台,详解Docker引擎的安装配置、ARM镜像的获取方法,并重点介绍如何使用Buil 阅读详情

相关推荐

嵌入式ARM Linux下i.MX6ULL蜂鸣器控制:从设备树到Sysfs与Libgpiod实践

通用输入输出(GPIO)是嵌入式系统与外部硬件交互的基础接口,其工作原理是通过配置处理器引脚的电平状态来控制外设。在Linux系统中,GPIO子系统提供了统一的抽象层,使得用户空间程序能够安全、高效地访问硬件。这项技术的核心价值在于实现了软件对硬件的灵活控制,是驱动开发、物联网设备及智能硬件等领域的关键。典型的应用场景包括控制LED、读取按键状态以及驱动蜂鸣器等简单执行器。本文以NXP i.MX6ULL平台为例,深入探讨了通过设备树(Device Tree)配置硬件资源,并分别使用传统的Sysfs接口和现代

weixin_33834910的博客 340

找不到/etc/syslog.conf解决办法

1、首先我们需要先确认我们的开发板上是否安装了syslog服务,在开发板的文件系统下输入syslogd help命令查看如果不支持就是busybox的版本太低了,如图出现this version of syslogd ignores /etc/syslog.conf就是这个版本的syslogd不支持/etc/syslog.conf,需要我们重新构建一个支持/etc/syslog.conf的linu...

星空语_的博客 8694

RK3588平台开发系列讲解(日志篇)RK3588 syslog的使用

📢上一篇我们介绍了`syslog`的基本知识,本篇实际使用`RK3588`演示`syslog`的使用。

内核笔记 3632

Linux系统日志服务syslog

介绍linux系统日志工具syslog

Austin_2020的博客 3266

对linux下syslogd以及syslog.conf文件的解读说明

今天小编就为大家分享一篇对linux下syslogd以及syslog.conf文件的解读说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

数据仓库ODS层详解- 功能、设计与最佳实践

数据仓库ODS层是大数据分析的基石,为企业决策提供可靠数据源。本文深入探讨ODS层设计原则、实施要点和最佳实践,涵盖金融、零售等行业应用。重点关注云环境下ODS层部署策略,以及实时数据集成、数据湖技术等创新趋势。文章还分析了数据体量增长、实时性需求等挑战,提供实用解决方案。whether助您构建高效、安全、可扩展的ODS层,为数字化转型奠定坚实基础。#数据仓库 #ODS层 #大数据分析 #云计算 #数据湖

一个8年大数据开发工程师的碎碎念 1万+

Arm Linux 日志方案 - syslog 初识和示例代码

syslog 是 glibc 提供的一组 C 接口(),它把日志通过 Unix 域套接字(/dev/log)发送给系统日志守护进程,由守护进程决定写到哪个文件、是否轮转、是否远程转发。进程 ──syslog()──> /dev/log (AF_UNIX SOCK_DGRAM) ──> rsyslogd / syslog-ng│远程日志服务器(@host:514)应用不碰磁盘:落盘、轮转、权限全是守护进程的事,程序只管"发"。同步但轻量:每次syslog()是一次 socketsendto。

weixin_46158019的博客 403

2023年全国赛C题《 电容电感测量装置》设计报告

参考下面网站的方案参考LCR测试仪,基本工作原理为给DUT加上正弦激励信号,然后测得该DUT两端的电压和流过DUT的电流,即可通过计算得到DUT的性质和参数。对于一个理想电容,电流相位应该超前电容两端电压90°。然而实际的电容存在损耗,可以等效为一个理想电容Cp​和一个理想电阻Rp​的并联,因此电流超前电压的相位将小于90°,这个角度差即为损耗角。假设DUT两端电压V˙Vcosωt,流过DUT的电流为I˙Isinωt−φ。

moerjie的博客 4816

Linux 守护进程

1. 守护进程概述         守护进程, 也就是通常所说的 daemon 进程, 是 Linux 中的后台服务进程。 它是一个生存期较长的进程, 通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。 守护进程常常在系统引导载入时启动, 在系统关闭时终止。 Linux 有很多系统服务, 大多数服务都是通过守护进程实现的。 同时, 守护进程还能完成许多系统任务, 例如, 作业规...

QtHalcon 3335

同步整流buck电路图设计:手把手入门必看

从零开始拆解同步整流Buck电路图及其原理,手把手带你画出关键拓扑、选型MOSFET、分析续流路径。重点讲清占空比控制逻辑与体二极管导通损耗的规避方法,让buck电路图及其原理真正落地可调、稳定可靠。

weixin_33308579的博客 997

当预编译包失效时:手把手教你在Nvidia Orin (JetPack 5.1.1) 上源码编译onnxruntime-gpu

本文详细指导在Nvidia Orin (JetPack 5.1.1) 上源码编译onnxruntime-gpu的全流程,解决预编译包兼容性问题。涵盖环境准备、工具链配置、源码编译、常见问题解决及性能优化技巧,帮助开发者在边缘计算设备上实现高效AI模型推理。

weixin_29062823的博客 135

Arm Linux 日志实战:zlog + 远程 syslog 双通道(本地文件 + 中心化收集)

工业网关 / 边缘设备最典型的日志诉求:本地留一份带轮转的详情日志方便现场排查,同时把关键错误实时送到远端日志中心做集中监控告警。 通道 1(本地):zlog 把业务日志写到本地文件,带大小轮转,便于现场 排障。 通道 2(远程):zlog 把 ERROR/FATAL 同时送到系统 syslog,由板子上的 转发到远程日志中心,做集中存储 / 告警。 1. zlog.conf:一个 category,两路输出 验证配置文件: 2. 板子 rsyslog:把 syslog 转发到远程 在板子

weixin_46158019的博客 451

在WIN10系统中安装TIA博途V18,重启后提示安装介质不可用,请插入DVD 或检查网络连接的解决办法

在WIN10系统中安装TIA博途V18,重启后提示安装介质不可用,请插入DVD 或检查网络连接的解决办法

Robot_PLC_HMI_Automation 1万+

【转】syslog服务和syslogd守护进程

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34245169的博客 224

Android11车机系统海外项目资源包RRO方案优化

本文介绍了汽车设置应用如何通过Android RRO(运行时资源叠加)方案实现多车型差异化资源管理。针对不同车型(国内/海外、轿车/SUV)和配置(方向盘、轮毂等),采用产品变体(productFlavors)构建不同APK版本,并通过JSON配置文件动态启用对应资源包。系统根据车辆下线配置自动匹配适用的资源叠加包,解决了硬编码判断带来的维护问题。该方案实现了资源的高效复用,同时支持灵活配置多种车型组合,为汽车行业多车型共平台开发提供了可扩展的技术实现。

shusuanly的博客 469

phpMyAdmin | mysqli::real_connect(): (HY000/2002): No such file or directory

第一次安装宝塔mysql服务是默认关闭的,需要手动打开,打开服务再次进入phpMyAdmin发现可以进入了。

吻等离子的博客 2872

守护进程的调试方法

 //守护进程的调试方法是通过linux的syslog即系统日志服务来实现的。程序运行信息将输入到"/var/log/messages"//系统日志文件中。syslogd的配置文件为/etc/syslog.conf。该机制提供了三个syslog函数分别为openlog/syslog/closelog//openlog:用于打开系统日志服务的一条连接//syslog:向日志文件中写入消息//clos

wenlifu71022的专栏 870

Vivado报错-4 [Routed 35-3424] SLL Assignment failed ILP VU19P

Vivado报错[Routed 35-3424] SLL Assignment failed ILP VU19P

weixin_39896700的博客 1409

Arm Linux 日志方案 - syslog 远程转发 、 local0/local1 分文件

✅ 应用侧用区分模块/进程,配置文件侧用localN.* 文件分流。✅ 通用规则记得加,避免一份日志写两处。✅ 远程转发生产用 TCP + 磁盘辅助队列(),断网不丢。✅ 改配置先校验,再kill -HUP平滑重载。✅ 必配logrotate,否则/var/log写满拖垮整机。❌ BusyBoxsyslogd不支持 rsyslog 语法与高级转发,需要请换完整 rsyslog。❌ 远程转发和本地落盘只进行了二选一 ——两者互补:本地保底,远程集中。

weixin_46158019的博客 106

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

在 Linux 上配置一个 syslog 服务器

在 Linux 上配置一个 syslog 服务器 syslog服务器可以用作一个网络中的日志监控中心,所有能够通过网络来发送日志的设施(包含了Linux或Windows服务器,路由器,交换机以及其他主机)都可以把日志发送给它。 通过设置一个syslog服务器,可以将不同设施/主机发送的日志,过滤和合并到一个独立的位置,这样使得你更容易地查看和获取重要的...

weixin_33734785的博客 135

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

linux进程全解

目录一、程序的开始和结束二、进程环境三、进程的正式引入四、fork创建子进程五、父子进程对文件的操作六、进程的诞生和消亡七、父进程wait回收子进程八、waitpid介绍九、exec族函数及实战十、进程状态和system函数十一、进程关系十二、守护进程的引入十三、编写简单守护进程十四、使用syslog来记录调试信息十五、让程序不能被多次运行十六、linux的进程间通信概述十七、linux的IPC机制1-管道十八、SystemV IPC介绍 一、程序的开始和结束 1、main函数由谁调用 (1)编译链接时的引

小嵌同学的博客 1735

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

配置linux syslog日志服务器

配置linux syslog日志服务器 目前,linux依旧使用syslogd作为日志监控进程,而在主流的linux发行版中依旧使用syslog这个比较老的日志服务器套件。对syslog进行必要的配置能减少很多麻烦,并且可更有效的从系统日志监控到系统的状态。理解并完善一个syslog的配置,对于系统管理员来说显得尤为重要。一、配置文件以红旗DC Server 5.0为例,默认的日志服务器就是sys...

weixin_34363171的博客 133

落实责任,开启linux审计功能

  (1)配置审计守护进程。  (3)启动守护进程,它启用了内核中的LinuxAuditingSystem并开始进行日志记录。  本章将详细讨论各个部分。  RedHatEnterpriseLinux5内核中的LinuxAuditingSystem默认是关闭的。当启动审计守护进程时,启用这个内核特性。要在启动时不通过守护进程auditd来启用LinuxA...

weixin_33896069的博客 818

linux下编写daemon程序步骤

一、引言 Daemon程序是一直运行的服务端程序,又称为守护进程。 本文介绍了在Linux下编写Daemon程序的步骤,并给出了例子程序。 二、Daemon程序简介 Daemon是长时间运行的进程,通常在系统启动后就运行,在系统关闭时才结束。一般说Daemon程序在后台运行,

风之谷 1235
上一篇: android中如何重定向程序的标准输出
下一篇: Linux 的伪终端的基本原理 及其在远程登录(SSH,telnet等)中的应用
简单并快乐着
博客等级 码龄15年 474粉丝 96原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值