[英]Python script that spawns processes fails to start under systemd
我有一个 python 脚本,它定期扫描一个文件夹以供 ffmpeg 处理。 我决定把它变成一个 systemd 服务。 该脚本在命令行上运行良好,但当我尝试将其作为服务运行时会引发 BlockingIOError。 为了解决这个问题,我将脚本简化为一个几乎是 hello world 的示例,但我仍然得到相同的结果。 这是我所拥有的:
foobar.py
import subprocess
result = subprocess.run(['/usr/bin/ffmpeg', '-h'])
print(result)
foobar.service
[Unit]
Description=foobar
[Service]
Type=simple
TasksMax=1
User=root
Environment="PATH=/usr/bin:/root/24-7"
ExecStart=/usr/bin/python3.8 /root/24-7/foobar.py
例外
Aug 26 12:47:55 Ubuntu-1804-bionic-64-minimal systemd[1]: Started foobar.
Aug 26 12:48:15 Ubuntu-1804-bionic-64-minimal python3.8[4539]: Traceback (most recent call last):
Aug 26 12:48:15 Ubuntu-1804-bionic-64-minimal python3.8[4539]: File "/root/24-7/foobar.py", line 6, in <module>
Aug 26 12:48:15 Ubuntu-1804-bionic-64-minimal python3.8[4539]: result = subprocess.run(['/usr/bin/ffmpeg', '-h'])
Aug 26 12:48:15 Ubuntu-1804-bionic-64-minimal python3.8[4539]: File "/usr/lib/python3.8/subprocess.py", line 489, in run
Aug 26 12:48:15 Ubuntu-1804-bionic-64-minimal python3.8[4539]: with Popen(*popenargs, **kwargs) as process:
Aug 26 12:48:15 Ubuntu-1804-bionic-64-minimal python3.8[4539]: File "/usr/lib/python3.8/subprocess.py", line 854, in __init__
Aug 26 12:48:15 Ubuntu-1804-bionic-64-minimal python3.8[4539]: self._execute_child(args, executable, preexec_fn, close_fds,
Aug 26 12:48:15 Ubuntu-1804-bionic-64-minimal python3.8[4539]: File "/usr/lib/python3.8/subprocess.py", line 1637, in _execute_child
Aug 26 12:48:15 Ubuntu-1804-bionic-64-minimal python3.8[4539]: self.pid = _posixsubprocess.fork_exec(
Aug 26 12:48:15 Ubuntu-1804-bionic-64-minimal python3.8[4539]: BlockingIOError: [Errno 11] Resource temporarily unavailable
Aug 26 12:48:15 Ubuntu-1804-bionic-64-minimal systemd[1]: foobar.service: Main process exited, code=exited, status=1/FAILURE
Aug 26 12:48:15 Ubuntu-1804-bionic-64-minimal systemd[1]: foobar.service: Failed with result 'exit-code'.
不知道还有什么可以尝试的。 我什至尝试使用 sleep() 延迟调用,以查看等待几秒钟是否会打开阻塞的任何内容。 我不知道该尝试什么。 有人有什么想法吗?
问题是您的TasksMax=1
。 这是预防子进程分叉,效果是不特定于subprocess.run
-任何如subprocess.Popen
或os.system
或os.fork
甚至非Python应用程序试图叉会遇到类似的问题。
这是os.fork
在受TasksMax=1
约束时显示类似的症状:
foobar.py
import os
pid = os.fork()
if pid == 0:
print("child")
os._exit(0)
else:
print(os.waitpid(pid, 0))
Aug 26 12:25:57 moon systemd[1]: Started foobar.
Aug 26 12:25:57 moon python3.8[9477]: Traceback (most recent call last):
Aug 26 12:25:57 moon python3.8[9477]: File "/root/24-7/foobar.py", line 3, in <module>
Aug 26 12:25:57 moon python3.8[9477]: pid = os.fork()
Aug 26 12:25:57 moon python3.8[9477]: BlockingIOError: [Errno 11] Resource temporarily unavailable
Aug 26 12:25:57 moon systemd[1]: foobar.service: Main process exited, code=exited, status=1/FAILURE
Aug 26 12:25:57 moon systemd[1]: foobar.service: Failed with result 'exit-code'.
如果您删除该行或增加限制,那么它将起作用。
即使只是使用简单的ffmpeg -h
示例将其增加到 2 也适用于我,尽管使用您想要运行的实际选项,您可能希望将其增加一点,以防万一ffmpeg
需要派生自己的子进程.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.