Python进程被systemd杀死的典型原因是OOM Killer触发、子进程管道阻塞、磁盘空间耗尽或文件描述符泄漏,需通过dmesg、journalctl、lsof和df排查。

Python进程被systemd杀死的典型表现
脚本在systemd托管下运行时,看似正常启动,但几小时后突然消失,journalctl -u your-service里出现Killed process (python)或Process 'python' killed by signal SIGKILL——这基本不是代码bug,而是OOM Killer干的。
systemd默认对服务施加内存限制(尤其在CentOS/RHEL 8+、Ubuntu 22.04+),且不提示。即使你用nohup python script.py &手动启动,若没显式禁用cgroup内存限制,仍可能被杀。
- 检查是否触发OOM:运行
dmesg -T | grep -i "killed process",看时间点附近是否有Out of memory: Kill process - 确认当前服务限制:
systemctl show your-service --property=MemoryLimit,返回MemoryLimit=9223372036854775807表示无限制;若为具体数值(如1G),就是瓶颈 - 临时解除限制(测试用):
sudo systemctl set-property your-service MemoryLimit=0
Python子进程未正确处理导致父进程僵死
自动化脚本常调用subprocess.Popen执行ffmpeg、curl或数据库命令,但忽略stdout/stderr管道阻塞问题——子进程输出缓冲区满后会挂起,父进程wait()永远卡住,最终被systemd判定为“not responding”而重启或终止。
典型错误写法:proc = subprocess.Popen(['some-command'], stdout=subprocess.PIPE),但没读取proc.stdout或没设timeout。
立即学习“Python免费学习笔记(深入)”;
- 必须设置
timeout参数:proc.wait(timeout=300),否则无限等待 - 避免PIPE堆积:用
subprocess.run(..., capture_output=True, timeout=60)替代Popen,更安全 - 若必须用
Popen,记得proc.communicate(timeout=60),它自动处理读取和等待 - 注意
shell=True时的信号传递问题:子进程可能收不到SIGTERM,建议shell=False并传列表参数
日志/临时文件无限制增长撑爆磁盘
脚本持续写print()到nohup.out,或用logging.FileHandler但没配轮转,几天后/var/log或/tmp占满,触发systemd因disk full强制终止服务(错误日志里可能只显示Failed with result 'resources')。
- 查磁盘:运行
df -h /tmp /var/log,重点关注Use%列 - 查大文件:
find /tmp -name "*.log" -size +100M -ls,或journalctl --disk-usage - 修复方式:改用
RotatingFileHandler,例如handlers.RotatingFileHandler('app.log', maxBytes=10_485_760, backupCount=5) - 避免
nohup裸跑:systemd服务应明确重定向,如StandardOutput=null或指向/dev/null,再用Python logging管日志
Python自身资源泄漏:requests连接未关闭
用requests.get()循环请求API却没调response.close(),或没用with requests.Session(),导致HTTP连接长期占用,fd耗尽(Too many open files错误),进而引发OSError: [Errno 24]崩溃。
- 检查当前进程句柄数:
lsof -p $(pgrep -f "python.*script.py") | wc -l,超过1024就危险 - requests默认不自动释放连接池,必须显式关闭:
resp = requests.get(url); resp.close() - 更推荐
with requests.Session() as s:,退出上下文自动清理 - 如果用
urllib,注意HTTPConnection需手动close(),urlopen则不用(但不推荐裸用)
真正难排查的,往往不是语法错误,而是systemd cgroup限制、子进程管道死锁、磁盘满、fd泄漏这四类隐性资源约束。它们不会报Python异常,只会让进程静默消失——盯住dmesg、journalctl、lsof和df四个命令,比翻代码快得多。


















