我有一个java程序,当我通过一个普通的shell命令(java -jar xxx.jar)启动它时,它在我的UNIX服务器上运行的非常好。
但是,我正在尝试通过cron执行预定的运行,并收到以下错误:
[0.075s][warning][os,thread] Failed to start thread - pthread_create failed (EAGAIN) for attributes: stacksize: 1024k, guardsize: 0k, detached.
Exception in thread "main" java.lang.OutOfMemoryError: unable to create native thread: possibly out of memory or process/resource limits reached
at java.base/java.lang.Thread.start0(Native Method)
at java.base/java.lang.Thread.start(Thread.java:801)
如前所述,它似乎不是java编码错误,因为它在启动shell时似乎运行时没有任何问题。它似乎也不是cron的一个错误,因为其他java程序执行得很好。
我看到cron的系统资源是有限的。因此,我检查了系统中的用户限制:
$ ulimit -a
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 1545091
max locked memory (kbytes, -l) 65536
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) unlimited
cpu time (seconds, -t) unlimited
max user processes (-u) 62987
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
然后我调整了cron的系统:
$ systemctl stop cron
$ sudo systemctl edit cron
$ systemctl daemon-reload
$ systemctl start cron
而且,在"systemctl编辑cron“的文件中,我试图复制ulimit值(在https://unix.stackexchange.com/questions/345595/how-to-set-ulimits-on-service-with-systemd中找到的映射)。
TasksMax=unlimited
LimitCORE=unlimited
LimitDATA=unlimited
LimitFSIZE=unlimited
LimitSIGPENDING=1545091
LimitMEMLOCK=65536
LimitRSS=unlimited
LimitNOFILE=1024
LimitSTACK=unlimited
LimitCPU=unlimited
LimitNPROC=62987
LimitAS=unlimited
LimitLOCKS=unlimited
然而,这一切并没有多大帮助,当cron试图启动程序时的错误仍然是相同的。
既然我在这里完全疯了,任何建议都是欢迎的。
发布于 2022-06-08 20:28:45
因此,经过进一步的研究,我发现"DefaultMaxTasks“必须为整个系统以及cron服务进行更改。这个值被设置为195,太低了。
有用的链接有:https://www.suse.com/support/kb/doc/?id=000015901 https://docs.oracle.com/en/database/oracle/oracle-database/19/ladbi/configuring-defaulttasksmax-for-suse.html#GUID-0815D18D-65E7-46B2-BA89-F54BA02EFCB8
更改整个DefaultTasksMax:
$ systemctl show --property DefaultTasksMax
DefaultTasksMax=195
$ cd /etc/systemd
$ vi system.conf
(set DefaultTasksMax = 65535)
$ systemctl daemon-reload
$ systemctl show --property DefaultTasksMax
DefaultTasksMax=65535
更改cron的值:
$ cd cron.service.d
$ ls
override.conf
$ vi override.conf
在override.conf中,我设置了新的值,包括。DefaultTasksMax:
DefaultTasksMax=65535
LimitCORE=unlimited
LimitDATA=unlimited
LimitFSIZE=unlimited
LimitSIGPENDING=1545091
LimitMEMLOCK=65536
LimitRSS=unlimited
LimitNOFILE=1024
LimitSTACK=unlimited
LimitCPU=unlimited
LimitNPROC=62987
LimitAS=unlimited
LimitLOCKS=unlimited
检查显示set值也是新为cron设置的:
$ systemctl status cron.service |grep -e Tasks
Tasks: 5 (limit: 65535)
在那之后,问题解决了。
https://stackoverflow.com/questions/72477454
复制相似问题