【问题标题】:linux Using system("ping") blocked in daemon processlinux使用系统(“ping”)在守护进程中被阻止
【发布时间】:2015-09-03 16:14:39
【问题描述】:

在我的守护进程中,我尝试使用 ping 来检测主机是否存活。

代码:

sprintf(pingCmd,"ping -c1 -t%d %s",time,ip);
if (system(pingCmd)) {
    //fail
}
else {
    //success
}

但是当我移除目标主机的网线时。

我的守护进程将在 system() 处阻塞

#0  0x00007f75362fbc7d in waitpid () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00007f7536281f5e in ?? () from /lib/x86_64-linux-gnu/libc.so.6
#2  0x00007f7536282370 in system () from /lib/x86_64-linux-gnu/libc.so.6

所以我写的是anthor程序,而不是守护进程

代码没有在 sysem() 处阻塞,

即使我移除了目标主机网线,

如何在守护进程中使用 system("ping")

【问题讨论】:

  • system 总是阻塞
  • and (system()) returns after the command has been completed linux.die.net/man/3/system
  • ping 的意义何在?如果是在做联系宿主的事情之前先检查宿主是否活着,那就没用了。
  • alive 是什么意思?活着意味着所有服务都在工作?然后不要使用ping。 ping 是一个等待没有活着的主机服务,在无法等待主机响应它不活着的服务器上执行得很糟糕。

标签: c linux daemon ping


【解决方案1】:

问题是 ping 命令被阻塞了。从命令行尝试完全相同的 ping 命令以查看结果。

顺便说一句,我强烈建议在守护进程中实现 ping 本身 - 您遇到的问题要少得多。通过 system() 函数运行命令会引入很多复杂性,可能会造成混淆并导致错误的结果。

话虽如此,要使其正常工作,请通过命令行测试找到正确的 ping 命令和正确的参数来完成这项工作。确保也检查超时。

【讨论】:

  • 我强烈建议不要费心 ping 主机,而是按预期使用它。例如,不响应 ping 的主机可能仍然很好,即使它确实响应了 ping,它也可能不响应 SSH 尝试。 ping 毫无价值。
  • 在大多数情况下,我倾向于同意安德鲁的观点。但是,这是 Ops 问题,ping 主机是有正当理由的。例如,也许他正在编写一个监控工具,该工具会在主机似乎无法访问时发出警报。当然,我不会通过这样的 ping 检查进行两步正常连接。
  • 顺便说一句,实现 ping 需要数据包(有时称为原始)套接字,而这仅适用于 root 眼睛...复杂的事情。使用主机的 ping 可见性意味着通常有一个并行进程执行 ping 并缓存结果,因此实际服务器不会浪费时间等待回复(它只会从缓存的最后回复中猜测,存储在某处)
  • 我遇到了和 OP 一样的问题。我的 ping 命令在 CLI 中工作,当我运行程序非守护程序时。但是程序运行守护进程时不起作用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-10
  • 1970-01-01
  • 2011-03-06
  • 1970-01-01
  • 2012-01-08
  • 2014-08-16
相关资源
最近更新 更多