为什么 CTRL-C 在一个用户帐户中有效,而在另一个用户帐户中无效?

为什么 CTRL-C 在一个用户帐户中有效,而在另一个用户帐户中无效?

我有一个 bash 脚本,它应该每 X 秒运行一个命令,直到操作员中断它。像这样:

测试文件

#!/bin/bash

while true; do
    echo Doing a thing...
    sleep 3 & wait
done

在大多数情况下,这会按预期工作。然而,在一个特定的用户帐户(这当然是我的帐户)这个运行在)CTRL-C组合键似乎没有向脚本发送中断信号,这意味着它会永远运行,直到我在另一个终端中杀死它。

次优。

我检查的第一件事是该帐户的 .profile 是否有某种未定义的 stty intr,但事实并非如此(并显式添加行

stty intr "^c"

对我的脚本没有帮助,将转义代码设置为不同的东西也没有帮助)。似乎.profile也没有在任何地方捕获任何信号。无论是sudo进入账户还是直接登录都会出现这个问题。CTRL-C当我从命令行运行其他命令(例如 ping)时,似乎按预期工作。

CTRL-C如果我以 root 身份运行脚本,或者在使用不同的非特权帐户登录时运行脚本,则会按预期中断脚本。使用默认的 .profile 创建一个全新的非特权帐户,它不起作用。这一切都使用相同的终端安装和设置(PuTTY),因此它似乎不是终端本身以某种方式拦截或破坏信号的情况。

我唯一能想到的是,这是一些影响行为的配置文件设置,但我在 .profile 中看不到任何内容,并且stty可能在 .profile 之外$TERM(在所有帐户中都是相同的)我想不出任何东西否则可能会像这样影响它。

(我现在不包括我的 .profile(s),因为,坦率地说,它们一团糟,我需要一段时间才能清理。我不太关心找出我的 .profile 出了什么问题。 se,特别是因为新帐户上的默认 .profile 也有这个问题,以及更多关于我应该在哪里寻找解决方案的信息。)

以防万一它们相关,我的 stty -a 设置(它们在工作帐户和非工作帐户中是相同的):

speed 38400 baud;
rows = 25; columns = 80; ypixels = 0; xpixels = 0;
intr = ^c; quit = <undef>; erase = ^h; kill = ^x;
eof = ^d; eol = <undef>; eol2 = <undef>; swtch = <undef>;
start = ^q; stop = ^s; susp = ^z; dsusp = <undef>;
rprnt = ^r; flush = ^o; werase = ^w; lnext = ^v;
-parenb -parodd -parext cs8 -cstopb hupcl cread -clocal -loblk
-ignbrk brkint -inpck -ignpar -parmrk -istrip -inlcr -igncr icrnl -iuclc
ixon -ixany ixoff -imaxbel
opost -olcuc onlcr -ocrnl -onocr -onlret -ofill -ofdel tab3
isig icanon -xcase echo echoe echok -echonl -noflsh
-tostop -echoctl -echoprt -echoke -defecho -flusho -pendin -iexten
-isscancode -xscancode

我缺少什么?如果重要的话,我正在 SCO OpenServer 6.0.0 MP4 上运行 GNU bash 3.2.17(1)-release。


其他尝试过的事情(在这里记录以使它们脱离评论线程)

  • 脚本运行时从另一个终端运行以下命令:

    kill -INT <process>
    

    即使以root身份运行kill命令,也没有完成任何事情。跑步

    kill -HUP <process>
    

    按预期终止脚本。

  • 我尝试通过将以下几行添加到我的脚本中来捕获信号:

    trap "echo hi" SIGINT
    trap "echo lo" SIGHUP
    

    如上所述击打CTRL-C或奔跑kill -INT <process>均无反应。按上面的方式运行kill -HUP <process>确实会按预期回显“lo”。

  • 我尝试通过以下方式运行脚本

    /bin/sh /path/to/test.sh
    /bin/bash /path/to/test.sh
    /path/to/test.sh
    cd /path/to; test.sh
    

    没有不同。

  • 正如 @mosvy 在评论中所建议的,我尝试通过 perl 运行它,如下所示:

    perl -e '$SIG{INT}="DEFAULT"; exec @ARGV or die "exec: $!"' /path/to/test.sh
    

    这,出于某种原因,做过工作。

相关内容