オペレーターが停止するまで、X秒ごとにコマンドを実行するようになっているbashスクリプトがあります。このように:
テストファイル
#!/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を含んでいません。なぜなら、正直なところ、そのプロファイルはめちゃくちゃでクリーンアップするのに時間がかかるからです。アカウントの既定の.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)リリースを実行しています。
試された他のもの(コメントスレッドから除外するためにここに文書化されています)
スクリプトの実行中に、他の端末で次のコマンドを実行します。
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
これは何らかの理由で、した働く