使用os.system()执行nohup命令时日志文件始终为空求助
解决os.system执行nohup命令日志为空的问题
问题核心
通过Python的os.system()执行nohup命令时,日志文件创建后始终为空,但直接在终端执行生成的命令却正常。这主要和环境变量传递、输出流重定向以及子进程IO处理逻辑有关。
解决方案
1. 在命令中直接指定环境变量
os.environ["PYTHONUNBUFFERED"] = "1"仅修改当前Python进程的环境变量,os.system()启动的后台nohup子进程不一定能正确继承该设置。直接把环境变量写在命令开头,确保子进程强制启用无缓冲输出:
train_command = "PYTHONUNBUFFERED=1 nohup python3 -u {} --model_dir={} --pipeline_config_path={} --num_train_steps={} > /lab/FastAPI/logs/train.out 2>&1 &".format( self.TRAINING_SCRIPT, self.paths['CHECKPOINT_PATH'], self.files['PIPELINE_CONFIG'], self.num_steps ) os.system(train_command)
额外添加2>&1是将stderr重定向到stdout,避免程序的错误输出没有写入日志文件。
2. 改用subprocess模块替代os.system
os.system()功能受限,subprocess模块能更精准控制子进程的环境和输出流,稳定性更强:
import subprocess import os env = os.environ.copy() env["PYTHONUNBUFFERED"] = "1" subprocess.Popen( [ "nohup", "python3", "-u", self.TRAINING_SCRIPT, "--model_dir", self.paths['CHECKPOINT_PATH'], "--pipeline_config_path", self.files['PIPELINE_CONFIG'], "--num_train_steps", str(self.num_steps) ], stdout=open("/lab/FastAPI/logs/train.out", "w"), stderr=subprocess.STDOUT, env=env, start_new_session=True )
start_new_session=True保证nohup进程在当前Python进程退出后仍能持续运行stderr=subprocess.STDOUT将错误输出合并到标准输出,统一写入日志- 显式传递复制后的环境变量,确保
PYTHONUNBUFFERED参数生效
3. 检查日志文件权限
如果以上方法无效,确认/lab/FastAPI/logs/目录及日志文件拥有可写权限,避免因权限不足导致内容无法写入。
内容的提问来源于stack exchange,提问作者Gabi Alexandru
相关产品推荐
相关产品推荐

