Я написал приложение на C, которое получает некоторые данные датчика и помещает их в строку. Эта строка передается в gammu-smsd-inject для передачи по SMSD. Для справки, мое приложение запускает gammu-smsd-inject с помощью fork () & Подождите(). Программа ожидает завершения gammu-smsd-inject и затем завершает свою работу.
Моя программа работает просто отлично: если я запускаю ее вручную из командной строки bash, она захватывает данные датчика, вызывает gammu-smsd-inject и завершает работу. Смс появляется в базе данных исходящих и вскоре после того, как я получаю смс на свой телефон.
Я добавил абсолютный путь к моей программе в директиве runonreceive SMSD. Когда я отправляю текст в SMSD, он поступает в папку «Входящие», и из файла журнала я вижу, как демон запускает мою программу. Затем в лог-файле говорится, что процесс (моя программа) успешно завершил работу (0), но я никогда не получаю смс и ничего не добавляется в таблицы исходящих или отправленных данных базы данных.
Есть идеи, что может происходить? Я не разместил кодовый листинг, так как он довольно длинный, но он доступен.
Единственное, о чем я мог подумать, это то, что это может произойти, это то, что gammu-smsd-inject, возможно, прерывается (родительским процессом где-то в дереве) ДО того, как он получит шанс сделать что-нибудь в SQL. Разве это не создаст ненулевой код выхода?
Таким образом, проблема была в том, какой пользователь запускал программу. Когда я запускал свое приложение вручную из bash, оно запускало его с моим идентификатором пользователя, но когда его запускал демон SMSD, оно запускалось с другим идентификатором, который по какой-то причине вызывал проблемы. Я думал, что это была проблема с идентификатором пользователя, используемым для доступа к базе данных mysql, но, видимо, нет. Короче говоря, я на самом деле не знаю, в чем проблема, но, назначив UID моего логина дочернему процессу, все неожиданно сработало.