我直接通过 ssh 连接到远程计算机 Linux RH6(在服务器上导入密钥),当我执行带有重新启动 java 服务的参数的 shell 脚本时,我遇到了一个奇怪的 ulimit 问题:
- 当我手动运行时,
./script.sh stop;./catalina.sh start
我发现打开文件的数量与系统文件中定义的不正常(1024)limits.conf
; - 当执行我设置的每周作业时,我从(16,384)
cron
获得正确的值;limits.conf
- 当我这样做
/bin/su - user
然后重新启动时,我
也有正确的值。
我需要一个解决方案来修改脚本,以某种方式获取我的系统值,并在 bash 脚本中拥有真正的登录 shell,并在需要手动重新启动服务时拥有正确数量的打开文件。
当前 shell 的硬限制:
ulimit -Ha
open files (-n) 4096
全球的:
cat /etc/security/limits.conf
oracle hard nofile 16384
问题:当执行 cron 作业时,当我从当前 shell 运行脚本时,打开的文件数为 16384 个!/script.sh stop; ./script.sh start
我有 4096。问题是当我手动运行脚本时如何获得 16384?
ps 编辑bashrc
和bash_profile
withulimit -n <number>
没有帮助。
答案1
只有 root 才能提高当前的硬限制。据推测,该用户的默认限制为/etc/security/limits.conf
16384,但初始化文件中的某些内容将该限制设置为 4096。
如果可以,请更改此初始化文件以仅设置软限制。任何用户可以随时向任一方向更改软限制,唯一的限制是它不能高于硬限制。即替换ulimit -a 4096
为ulimit -Sa 4096
.
无论如何,你所做的事情都是狡猾的。您可能不应该以运行服务的用户身份运行 shell,您应该从您的帐户进行维护,sudo
根据需要使用不同的权限运行命令。因此,要启动该服务,您不应该使用./script.sh stop;./catalina.sh start
但是
sudo -u user ./script.sh stop; sudo -u user ./catalina.sh start
这不会运行可能会降低限制的初始化文件。
原则上,您的系统配置可能会根据您的登录方式,通过 PAM(/etc/pam.conf
或/etc/pam.d/*
)设置不同的规则来设置不同的限制。然而,这将是一个奇怪的、不寻常的配置。
答案2
与其手动运行./script.sh stop;./catalina.sh start
并单独使用具有相同功能的 cronjob,不如使用/etc/init.d/catalina
可以配置所有限制、环境变量等的脚本;然后要启动/停止,只需运行sudo /etc/init.d/catalina start
(或stop
、restart
等);或者,更简单(如果可用)sudo service catalina start
(等等)。正如您所发现的,从不同的环境启动/停止进程有点容易出错;将所有内容放入 init 脚本中将有助于一致且干净地启动/停止进程(并正确记录)。
编辑:并且,如果您不使用sudo
也不使用初始化脚本,那么只需编写相同的脚本(就像您正在创建初始化脚本一样),将其保存在您的$HOME/bin
(或任何地方)中,并在该脚本内设置环境(限制、环境变量等)根据需要;从 cron、shell、远程 ssh、puppet 等调用它。稍后,如果您想将其配置为服务(通常是这种情况),那么这项工作就已经完成了。