【问题标题】:Core dump when running C program using systemd使用 systemd 运行 C 程序时的核心转储
【发布时间】:2018-05-14 09:31:08
【问题描述】:

我有一个用 C 语言编写的程序,在直接从命令行运行时运行良好,但在使用 systemd 运行时失败:

Core was generated by `/usr/local/bin/midnite-modbusd'.
Program terminated with signal SIGFPE, Arithmetic exception.
#0  0x0000000000401308 in main (argc=1, argv=0x7ffeae390268) at src/midnite-modbusd.c:139
139                     slen= interval - (millis % interval);

有问题的代码:

//wait for start of each sample interval
gettimeofday(&tv,NULL);
millis= (long long unsigned)tv.tv_sec*1000 + (tv.tv_usec/1000);
slen= interval - (millis % interval);
i= (millis+slen) % 1000;
usleep (slen*1000);

完整代码is available on github

系统单位:

[Unit]
Description=Midnite Classic modbus data polling
After=network.target

[Service]
Type=simple
User=midnite-modbusd
ExecStart=/usr/local/bin/midnite-modbusd
Restart=on-failure

[Install]
WantedBy=multi-user.target

当程序使用 systemd 运行时会有什么不同?

编辑 1

我的程序似乎存在仅在使用 systemd 运行时才会出现的主要问题:

  • 它不会读取我的配置文件,这应该会抛出一个错误消息和exit(1)because of invalid values
  • journactl 没有实时填写。使用journactl -f我必须等待几分钟才能看到一堆突然出现的日志

作为使用我运行的命令行的测试的旁注:sudo -H -u midnite-modbusd /usr/local/bin/midnite-modbusd

【问题讨论】:

  • 你初始化interval了吗?
  • @GauravSehgal 如果没有作为参数提供,他不会。所以也许这就是问题所在?也许systemd 没有提供命令行参数(至少在这个例子中)。
  • 作为脚本开头的全局:int interval; //采样间隔
  • @Laurent 初始化为已知值,而不是声明它。
  • @JoseFelipe 在 systemd 下运行时,信号处理程序更可能存在差异。

标签: c daemon systemd


【解决方案1】:

配置文件中定义的sample_interval值将初始化interval,请检查文件是否正确以及sample_interval是否存在。 interval 的未初始化值可能会导致除以零异常

【讨论】:

  • 是的,我可以毫无问题地运行sudo -H -u midnite-modbusd /usr/local/bin/midnite-modbusd。但是,当从 systemd 运行完全相同的命令时,它会崩溃。
  • @vnay-p 请查看我对问题的编辑,当使用 systemd 运行时,程序似乎没有读取配置文件。
【解决方案2】:

我在这段代码中发现了问题:

if (getppid()==1) {
    sprintf(str, "Daemon aready running");
    log_message(log_file_path,(char*)str);
    return;
}

此代码用于当程序打算将自身 fork 以作为“旧式”守护程序运行时。 我没有意识到,因为 systemd 正在分叉它,所以程序有一个父进程(因此 getppid() 在使用 systemd 但不是从命令行运行时返回 1

无论如何它写得不好:这个测试应该停止脚本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    相关资源
    最近更新 更多