【问题标题】:How to redirect the output of system() called in a C program to syslog?如何将 C 程序中调用的 system() 的输出重定向到 syslog?
【发布时间】:2020-11-27 15:28:15
【问题描述】:

在我的 C 代码中,我调用 system 以获取 bash 命令的结果。

system("ps aux | grep my_prog | head -n 1")

当我在 foreground 模式下运行我的程序时一切都很好,但在生产中是一个 service,所以我需要在@987654324 中查看system 的输出@,而不是 stdoutstderr

我正在努力在这里找到最好和最不痛苦的选择。 有合适的方法吗?

【问题讨论】:

  • “最不痛苦”很大程度上取决于您的观点。现在对你来说可能是最简单的改变很可能在未来非常痛苦。例如,system( "sh -c 'ps aux | grep my_prog | sed 1q | logger'"); 现在可能看起来很无痛,但将来可能会导致哭泣和咬牙切齿。
  • 感谢@WilliamPursell,这正是我写“痛苦”的原因,因为我看到了logger 选项,但我根本不想这样做。

标签: c output system syslog


【解决方案1】:

正确的做法是使用popen()而不是system(),然后是syslog接口man 3 syslog

NAME
   closelog, openlog, syslog - send messages to the system logger

SYNOPSIS
   #include <syslog.h>

   void openlog(const char *ident, int option, int facility);
   void syslog(int priority, const char *format, ...);
   void closelog(void);

   #include <stdarg.h>

   void vsyslog(int priority, const char *format, va_list ap);

另请注意,grepping ps 输出有其缺陷(例如,它也可能首先返回 grep 进程)。为什么不在迭代ps 输出的C 代码中搜索正确的进程呢?还是使用操作系统提供的函数直接迭代进程表?

【讨论】:

  • 谢谢,我试试。我认为这是最好的解决方案。
  • 谢谢。我按照你的建议实施了,它有效。你能否就你关于ps 陷阱的笔记给我额外的解释,我不确定我是否理解。谢谢
  • @Kyrol 进程 my_prog 的简单 grep 通常会返回至少两个匹配项。 head -n 1 选择了第一个,但是你怎么知道 ps 没有先返回 grep 进程呢?您做出的假设可能会成为错误。
  • 我明白你的意思。那么,如何在我的 C 代码中迭代进程表。我从来没有这样做过,是新的东西。有什么提示吗?谢谢
  • @Kyrol 在我的系统 FreeBSD 上,我可以使用kvm_getprocs() 向内核请求进程表。对于 Linux,也许stackoverflow.com/questions/939778 是一个起点。但只使用popen("ps aux") 就足够了,然后使用 strcmp() 找到有趣的过程。
猜你喜欢
  • 1970-01-01
  • 2012-06-26
  • 2011-02-08
  • 1970-01-01
  • 2018-10-15
  • 1970-01-01
  • 1970-01-01
  • 2020-10-24
  • 1970-01-01
相关资源
最近更新 更多