ubuntu24.04编译大型项目时自动重启的解决方法
最近想编译一个安卓通用系统镜像(GSI),发现在编译到某个固定的位置时,系统会直接自动重启。折腾的过程中发现linux内核似乎没有崩溃。dmesg也没有发现异常,一开始以为是显卡驱动的问题,但是装什么版本都没有用。后来在/var/log/syslog系统日志里发现是systemd-oomd因为内存占用过高直接把图形化桌面杀死了不得不吐槽ubuntu的系统日志是真的多,这个原因我找了两天。因为我的编译的命令是在gnome的终端里执行的,所以也一起被杀掉了天才设计。
systemd-oomd杀进程的有两个触发条件:1.系统内存占用高于阈值超过指定时间;2.虚拟内存占用高于阈值超过指定时间。这两个满足任意条件就会触发非常激进的杀进程机制。因为没钱买内存条,所以编译时内存占用很高很常见。在搜索解决办法的过程中我发现几年前就有人抱怨ubuntu因为systemd-oomd乱杀进程。这里给出的解决办法是直接停用systemd-oomd。
在终端里输入:
systemctl disable --now systemd-oomd
正常应该返回以下信息:
Removed /etc/systemd/system/multi-user.target.wants/systemd-oomd.service
Removed /etc/systemd/system/dbus-org.freedesktop.oom1.service
验证一下是否成功关闭:
systemctl is-enabled systemd-oomd
应该返回:
disabled
为了防止systemd-oomd被自动重新启用可以使用”mask”:
systemctl mask systemd-oomd
这时会返回:
Created symlink /etc/systemd/system/systemd-oomd.service → /dev/null
在检查一下:
systemctl is-enabled systemd-oomd
返回:
masked
这样再编译时就不会重启了。
如果想要重新启用systemd-oomd,可以执行:
systemctl enable systemd-oomd
systemctl unmask systemd-oomd
发表评论