我正在尝试在 Singularity 容器内运行 python 子进程,如下所示:
singularity exec image_name python python_task.py
在 python_task.py 中,它使用 cmd 调用此函数:
def run_shell_cmd(cmd):
p = subprocess.Popen(
['/bin/bash', '-o', 'pipefail'], # to catch error in pipe
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
universal_newlines=True,
preexec_fn=os.setsid) # to make a new process with a new PGID
pid = p.pid
pgid = os.getpgid(pid)
log.info('run_shell_cmd: PID={}, PGID={}, CMD={}'.format(pid, pgid, cmd))
t0 = get_ticks()
stdout, stderr = p.communicate(cmd)
rc = p.returncode
t1 = get_ticks()
err_str = (
'PID={pid}, PGID={pgid}, RC={rc}, DURATION_SEC={dur:.1f}\n'
'STDERR={stde}\nSTDOUT={stdo}'
).format(
pid=pid, pgid=pgid, rc=rc, dur=t1 - t0, stde=stderr.strip(), stdo=stdout.strip()
)
if rc:
# kill all child processes
try:
os.killpg(pgid, signal.SIGKILL)
except:
pass
finally:
raise Exception(err_str)
else:
log.info(err_str)
return stdout.strip('\n')
但是我收到此错误/异常
Exception: PID=23793, PGID=23793, RC=255, DURATION_SEC=0.1
STDERR=WARNING: Could not lookup the current user's information: user: unknown userid 29931
FATAL: Couldn't determine user account information: user: unknown userid 29931
关于如何纠正这个问题有什么建议吗?我认为容器内不存在用户 ID 29931,这会导致此错误。但我不知道如何解决这个问题。
我想说谢谢你发布这个。我认为解决方案是不使用子流程。我可以说我在 HPC 环境中遇到了这种情况,其中计算节点可能不知道用户 ID。