You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 09:18:02