sudo+fork+Python subprocess触发[Errno 38] Function not implemented错误的排查求助
sudo+fork+Python subprocess触发[Errno 38] Function not implemented错误的排查求助
我遇到了一个特别诡异的问题,折腾了半天没理清原因,来求助大家!先给大家看一段简化后的Python脚本(我把它存为app.py),逻辑很简单:fork一个子进程,然后在这个子进程里调用subprocess.run执行另一个命令:
import os import subprocess if os.fork() > 0: os._exit(0) subprocess.run(["/bin/true"])
下面是几种不同运行方式的结果:
正常运行的场景
- 以普通用户身份运行完全没问题:
$ python3 app.py $ echo $? 0
- 先通过
sudo bash进入root shell,再运行脚本也一切正常:
$ sudo bash # python3 app.py #
异常失败的场景
但是当我直接用sudo来运行这个脚本时,就会出现匪夷所思的报错:
$ sudo python3 app.py $ Traceback (most recent call last): File "/tmp/app.py", line 7, in <module> subprocess.run(["/bin/true"]) File "/usr/lib/python3.11/subprocess.py", line 548, in run with Popen(*popenargs, **kwargs) as process: ^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3.11/subprocess.py", line 1026, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, File "/usr/lib/python3.11/subprocess.py", line 1955, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) OSError: [Errno 38] Function not implemented: '/bin/true'
还有另一种类似的异常情况:先进入sudo shell,再用exec替换当前进程运行脚本,同样会触发相同的报错:
$ sudo bash # exec python3 app.py $ Traceback ... (same error message as above)
我实在搞不懂,为什么subprocess.run创建的子进程会触发ENOSYS(函数未实现)的错误,而且只有当父进程是直接通过sudo启动的时候才会出现这种问题?
更新补充
我使用的系统是TrueNAS SCALE(基于Debian的Linux发行版),Python版本为3.11.9。之后我在另一台普通Linux系统上测试了相同的脚本,没有复现这个问题,所以现在我怀疑这可能和sudo的配置或者内核的安全限制选项有关,但还不确定具体是哪部分导致的。
备注:内容来源于stack exchange,提问作者ab.
相关产品推荐
相关产品推荐

