【问题标题】:What are the side effects of "ulimit -t unlimited" in ksh93?ksh93中“ulimit -t unlimited”的副作用是什么?
【发布时间】:2020-10-04 17:10:27
【问题描述】:

我被这个ksh93 bug(也是here)咬了。这是一个接近我的用例的SSCCE

$ cat bug.sh
#!/bin/ksh93

unset a b
c=0

function set_ac { a=1; c=1; }
function set_abc { ( set_ac ; b=1 ) }

set_abc
echo "a=$a b=$b c=$c"

$ ./bug.sh
a=1 b= c=0

因此,虽然set_abc 在子shell 中调用set_ac,但分配a=1 会传播到父shell。有几个已知的workarounds,我倾向于用

替换上面的set_abc
function set_abc { ( ulimit -t unlimited ; set_ac ; b=1 ) }

这似乎工作正常。现在我想知道ulimit -t unlimited 除了引发子shell fork(这是解决方法的重点)之外是否有任何副作用,这可能会在将来给我带来麻烦。 (FWIW:这应该由没有 root 权限的用户运行。)

【问题讨论】:

    标签: ksh ulimit


    【解决方案1】:

    最新的 ksh93 版本的非分叉/虚拟子外壳的实现充满了错误。子shell 应该是从父shell 环境复制但与父shell 环境完全分离的环境。强制子shell fork 将这种分离委托给内核,这是非常健壮的。因此,唯一的副作用应该是(1)性能明显变慢和(2)错误更少。

    至于ulimit 本身,使用unlimited 参数也不应该引起任何副作用,因为这是默认设置。唯一的可能是父 shell 环境已经用ulimit -t 限制了 CPU 时间;在这种情况下,您无权将其设置回unlimited,它会打印一条错误消息。但是,它仍然强制分叉。因此,为了完全安全,您可以改用ulimit -t unlimited 2>/dev/null 来抑制任何可能的错误消息。

    【讨论】:

    • 只是补充一点,我们中的一些人正在积极致力于修复这些错误和许多其他错误:github.com/ksh93/ksh——每个感兴趣的人都被邀请参与。 ksh 活着!
    猜你喜欢
    • 2013-03-28
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 2017-07-19
    • 2012-10-26
    • 2021-04-27
    • 1970-01-01
    相关资源
    最近更新 更多