不要次兔兔 2024-02-07 21:08 采纳率: 100%
浏览 5
已结题

Ubuntu systemctl 自启动路径问题

我在写了一个自启动服务,开机启动一个可执行文件,现象是这个可执行程序无法读写同级目录下的另一个文件。
程序调试时没问题,可以正常读写。但放到开机自启动就不行了,开机没有写入数据,查看服务和进程都在运行。
我打开文件的路径是直接用文件名打开,fopen("a.txt","r"),是不是这个在自启动时就是另一个位置了,所以没能正常读写文件?换成fopen("./a.txt","r")是不是可以了?请问有人可以说说这两者有什么区别吗,感谢

  • 写回答

4条回答 默认 最新

  • 叫兽-郭老师 Java领域新星创作者 2024-02-07 21:09
    关注

    参考通义千问和郭老师的小迷弟雅思莫了-编写提供,主要是为了帮助您快速解决问题,如下回答,您可以参考下,如有问题,评论区留言。

    在Ubuntu系统中使用systemd配置自启动服务时,你遇到的文件读写问题可能与可执行程序运行时的工作目录(working directory)有关。当通过systemctl启动服务时,默认的工作目录并不是你期望的可执行文件所在目录。

    1. 使用 fopen("a.txt", "r") 时,程序会在当前工作目录下查找名为 "a.txt" 的文件。如果服务启动时的工作目录不是你的可执行文件所在的目录,那么它将无法找到并打开这个文件。

    2. 而使用 fopen("./a.txt", "r"),则明确指示了程序应该在当前工作目录下查找 "a.txt" 文件。这里的 ./ 表示当前目录,这样即使工作目录发生变化,只要相对于可执行文件本身来说 "a.txt" 是同级目录下的文件,它就能够正确地找到并打开该文件。

    要解决这个问题,你可以通过在 systemd 的服务单元配置文件(通常位于 /etc/systemd/system/your-service-name.service)中的 WorkingDirectory= 参数指定服务启动时的工作目录为可执行文件所在的目录:

    [Unit]
    Description=Your Service Description
    
    [Service]
    ExecStart=/path/to/your/executable
    WorkingDirectory=/path/to/your/executables/directory
    
    [Install]
    WantedBy=multi-user.target
    

    这样一来,当服务启动时,其工作目录就会被设置为你期望的路径,从而使得 fopen("./a.txt", "r") 能够正常工作。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 2月24日
  • 已采纳回答 2月16日
  • 创建了问题 2月7日

悬赏问题

  • ¥15 onlyoffice编辑完后立即下载,下载的不是最新编辑的文档
  • ¥15 求caverdock使用教程
  • ¥15 Coze智能助手搭建过程中的问题请教
  • ¥15 12864只亮屏 不显示汉字
  • ¥20 三极管1000倍放大电路
  • ¥15 vscode报错如何解决
  • ¥15 前端vue CryptoJS Aes CBC加密后端java解密
  • ¥15 python随机森林对两个excel表格读取,shap报错
  • ¥15 基于STM32心率血氧监测(OLED显示)相关代码运行成功后烧录成功OLED显示屏不显示的原因是什么
  • ¥100 X轴为分离变量(因子变量),如何控制X轴每个分类变量的长度。