我的带有子进程的 python 脚本在作为 systemctl 服务运行时不起作用

问题描述 投票:0回答:0

完全菜鸟,所以请多多包涵。

我有一个 python 脚本,当我按下遥控器的按钮时,它会运行一个子进程。子进程是一个小的 C 程序,它测量音频信号的采样率并将值作为二进制传递给 python 脚本。

一旦 python 脚本获得值,我需要将它乘以 10 并继续做其他事情。

python代码的相关部分是这样的:

def oled_stringSR():

    a = subprocess.run("gcc freq_count_2.c -lpigpio -lrt -o out1;./out1", capture_output = True, shell = True)
    d = 10*int(a.stdout)
    if d < 40001:
        sample_rate = 32
    elif 40000 < d < 46001:
        sample_rate = 44.1

等等……

当我使用 sudo 从终端运行完整脚本时,一切都按预期工作。但是,当我将它作为 systemctl 服务运行并使用遥控器触发脚本的那部分时,它停止工作并且 journalctl 注册以下内容:

May 17 23:19:00 raspcamilla oled[1076]: Traceback (most recent call last):
May 17 23:19:00 raspcamilla oled[1076]:   File "/home/marcosch/remote.py", line 2231, in <module>
May 17 23:19:00 raspcamilla oled[1076]:     main()
May 17 23:19:00 raspcamilla oled[1076]:   File "/home/marcosch/remote.py", line 1267, in main
May 17 23:19:00 raspcamilla oled[1076]:     oled_stringSR()
May 17 23:19:00 raspcamilla oled[1076]:   File "/home/marcosch/remote.py", line 2084, in oled_stringSR
May 17 23:19:00 raspcamilla oled[1076]:     d = 10*int(a.stdout)
May 17 23:19:00 raspcamilla oled[1076]: ValueError: invalid literal for int() with base 10: b''

看起来 C 程序没有运行或没有输出。 当我在没有 sudo 的情况下从终端运行 python 脚本时,我得到了完全相同的错误,所以我怀疑这是第二个选项。我读到 systemctl 服务总是从 root 运行......知道这里发生了什么吗?

作为附加信息: 所有这些都在运行在树莓派上的 Ubuntu 服务器 22.04 中。

任何帮助、线索或评论将不胜感激,谢谢!

在阅读了其他类似(可能不太相似)的问题和解决方案后,我尝试修改服务文件,但没有成功。我目前的服务是这样的:

[Unit]
After=syslog.target
StartLimitIntervalSec=10
StartLimitBurst=10

[Service]
Type=simple
ExecStart=python3 /home/marcosch/remote.py
Restart=always
RestartSec=1
StandardOutput=journal
StandardError=journal
SyslogIdentifier=oled
User=root
Group=root

[Install]
WantedBy=graphical.target
python c subprocess
© www.soinside.com 2019 - 2024. All rights reserved.