Дамп ядра при запуске программы на C с использованием systemd - PullRequest
0 голосов
/ 14 мая 2018

У меня есть программа на 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);

Полный код доступен на github .

Модуль systyemd:

[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) из-за недопустимых значений
  • journactl не заполняется в режиме реального времени.Используя journactl -f Мне нужно подождать пару минут, прежде чем я вижу кучу журналов, которые появляются внезапно

В качестве примечания к моим тестам с использованием командной строки, которую я запускаю: sudo -H -u midnite-modbusd /usr/local/bin/midnite-modbusd

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Я нашел проблему в этом коде:

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

Этот код предназначен для случая, когда программа была предназначена для разветвления, чтобы она работала как демон "старого стиля". Я не осознавал, что, поскольку systemd его разветвляет, у программы есть родительский процесс (таким образом, getppid() возвращает 1 при запуске с systemd, но не из командной строки)

В любом случае это плохо написано: этот тест должен остановить скрипт.

0 голосов
/ 14 мая 2018

Определенное значение sample_interval из файла конфигурации инициализирует интервал , пожалуйста, проверьте, является ли файл правильным, и присутствует sample_interval .Неинициализированное значение интервал может вызвать исключение деления на ноль

...