【发布时间】: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);
系统单位:
[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 下运行时,信号处理程序更可能存在差异。