首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我不能在subshell上设置ulimit

我不能在subshell上设置ulimit
EN

Ask Ubuntu用户
提问于 2023-04-20 16:28:42
回答 1查看 227关注 0票数 2

我有个巴什剧本。这个bash脚本需要每5分钟运行一次,所以我创建了这个代码块:

代码语言:javascript
复制
#!/bin/bash
ulimit -n 600000
ulimit -u 600000
echo -e "This is another bash script to run mybashscript.sh"

# Lets create mycronscript.sh
echo "#!/bin/bash
ulimit -n 600000
ulimit -u 600000
while true; do
sleep 300
bash mybashscript.sh
done" >> mycronscript.sh
bash mycronscript.sh&

每当它在5分钟后自动运行时,mybashscript.sh就无法正常运行,因为ulimit设置没有被应用。我怎么才能修好它?

EN

回答 1

Ask Ubuntu用户

发布于 2023-04-20 17:22:22

代码中有两个明显的问题:

首先,您需要在echo之后的字符串周围使用单引号,以防止shell将shebang #!/bin/bash中的!解释为历史扩展特征 (在双引号中展开).所以它应该是这样的:

代码语言:javascript
复制
echo '#!/bin/bash
ulimit -n 600000
ulimit -u 600000
while true; do
sleep 300
bash mybashscript.sh
done' >> mycronscript.sh

您可能不会注意到,当在非交互式shell中从脚本内部运行时,在默认情况下不启用历史记录,而从交互式shell运行时则不会注意到这个问题.但是,它可能/会回咬您(例如,它将自动运行以/bin/bsh开头的最后一个命令--例如,如果您以前使用/bin/bash scriptfile运行了一些脚本,该命令将立即运行,而不需要您的确认)--例如,当您的shell设置/环境变量更改以启用非交互式shell中的历史记录时。

但是,我会使用更好的格式化机制替代方案,例如使用类似于这样的这里文件

代码语言:javascript
复制
cat > mycronscript.sh <<EOF
#!/bin/bash
ulimit -n 600000
ulimit -u 600000
while true; do
sleep 300
bash mybashscript.sh
done
EOF

甚至是shell内置的printf(利用其格式化功能),而不是echo

另外,您使用附加运算符>>可能意味着mycronscript.sh已经有了一些行/代码,并且您正在追加.如果是这样的话,你最终会得到一个混乱的、无法使用的脚本.如果不是这样,那么使用>操作符覆盖脚本文件的内容。

其次,您需要以更高的权限(即sudo )运行脚本,以增加最大用户进程限制或最大打开文件限制.等使用ulimit超过硬限制.所以它应该是这样的:

代码语言:javascript
复制
sudo bash mainscript.sh

注意:如果您在脚本上使用sudo并同时将其发送到后台,例如:

代码语言:javascript
复制
sudo bash mycronscript.sh &

您可能需要使用fg将其带回前台,以便能够输入sudo的密码,否则脚本将在后台等待密码,而不会在未注意到的情况下执行.因此,要么使用上面描述的sudo运行您的主forground脚本,要么使用例如sudo -i登录到根shell,然后在没有sudo的情况下在那里运行脚本,并且非常小心,因为您运行的每个命令都将以root权限运行。

我也不会热衷于在脚本中使用sudo

另外,请注意,ulimit是shell内置的,它提供了对在当前shell下启动的进程可用的资源的控制,并且不会对其他外部shell产生任何影响。

另外,请注意,您可以使用root选项降低/增加不使用-S特权的软限制,只要它不超过设置的硬限制.就像这样:

代码语言:javascript
复制
ulimit -S -u {N}

其中{N}是一个小于硬极限的数.您可以通过以下方式打印例如用户进程的硬限制:

代码语言:javascript
复制
ulimit -H -u

或对所有限制,包括:

代码语言:javascript
复制
ulimit -H -a

您还可以在没有root特权的情况下降低硬限制,例如:

代码语言:javascript
复制
ulimit -H -u {N}

或者,当没有指定任何选项时,-H-S都是默认的,因此:

代码语言:javascript
复制
ulimit -u {N}

但是,如果没有root权限,您就不能再次引发它。

票数 5
EN
页面原文内容由Ask Ubuntu提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://askubuntu.com/questions/1464412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档