systemd启动定时打开Google Meet链接的C程序时产生core dump问题
问题原因与修复方案
核心崩溃原因
- 空指针导致段错误:systemd系统服务的运行环境默认不设置
XDG_DATA_HOME环境变量,代码中getenv("XDG_DATA_HOME")会返回NULL,后续strcpy(full_path, NULL)直接触发非法内存访问,是coredump的直接诱因。 - 运行环境不匹配:libnotify发送桌面通知、
xdg-open调用浏览器都依赖当前桌面会话的DISPLAY、XAUTHORITY等图形相关环境变量,systemd系统服务默认无这些变量,就算路径问题修复,后续调用也会崩溃或执行失败。 - 用户权限不匹配:systemd服务默认以root用户执行,读取的是root用户的配置路径,和普通用户下存放
schedule.txt的路径完全不匹配,会触发文件打开失败直接退出。
修复步骤
1. 代码修改
将main函数中路径拼接的逻辑替换为容错版本,避免空指针访问:
char full_path[100]; const char *xdg_data = getenv("XDG_DATA_HOME"); if (xdg_data == NULL) { const char *home = getenv("HOME"); if (home == NULL) { fprintf(stderr, "无法获取用户主目录路径\n"); exit(EXIT_FAILURE); } // XDG_DATA_HOME默认值为 ~/.local/share snprintf(full_path, sizeof(full_path), "%s/.local/share%s", home, FILE_NAME); } else { snprintf(full_path, sizeof(full_path), "%s%s", xdg_data, FILE_NAME); }
同时可增加可选容错:对notify_init的返回值做判断,避免通知初始化失败崩溃;execlp执行失败后子进程直接调用exit(EXIT_FAILURE)退出。
2. systemd服务配置修改
优先选择用户级systemd服务方案,无需手动配置环境变量:
- 将service文件移动到
~/.config/systemd/user/目录下 - 执行
systemctl --user daemon-reload重载配置 - 启动命令为
systemctl --user start sgma.service,开机自启命令为systemctl --user enable sgma.service
如果坚持使用系统级服务,修改service文件的Service段如下:
[Service] Type=simple User=替换为你的普通用户名 Environment="DISPLAY=:0" Environment="XAUTHORITY=/home/替换为你的普通用户名/.Xauthority" ExecStart=/usr/local/bin/sgma Restart=on-failure
内容的提问来源于stack exchange,提问作者walidathome
相关产品推荐
相关产品推荐

