我有一个 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
这,出于某种原因,做过工作。