6

私はbashでこのクエリを実行しています:

mkfifo resp
while true; do 
    sudo nc -l -p 80 < resp |
    (cat & echo -e "HTTP/1.1 200 OK\r\n\r\nhello :)" > resp) ||
    break; 
done

ただし、 Iの場合Ctrl+C、何も起こらず、端末がロックされます。

なんで?私は何を間違っていますか?

4

2 に答える 2

2

私の環境(RHEL)でこれを再現することはできません--CTRL-Cはこれでうまく機能します。端末がロックされたら、新しい端末を開いて、strace -p何が起こっているかを確認するために使用します。

ただし、コマンドの設定全般には問題があると思います。

まずcat、サブシェルでバックグラウンドを使用しているということです。 これを行うとstdincat/dev/nullnc、サブシェルにパイプしている出力ではなくコマンドが作成されます。これの出力を比較することにより、違いを確認できます。

#! /bin/bash
# doesn't print yay
while true; do
    echo yay |
    (cat & false) ||
    break
done

これとともに:

#! /bin/bash
# does print yay
while true; do
    echo yay |
    (cat ; false) ||
    break
done

また、これが意図的なものかどうかはわかりませんが、ループの終了条件は通常、サブシェルの終了コードに基づいています。これは、の終了コードになり、echo常に成功します。一般に、ループは無限です。false上記のいずれかをecho:に置き換えると、これを確認できます。

#! /bin/bash
while true; do
    echo yay |
    (cat & echo test) ||
    break
done

そして、@ chepnerが指摘したようにnc、一般的な使用法も正しくありません。そのマンページによると:

-l      Used to specify that nc should listen for an incoming connection rather than initiate a connection to a remote host.  It is an error to use this option in conjunction with the -p, -s, or -z options.

これにより、実際にはncコマンドはまったく何もしません(出力なし、ただそこに座ってください)。mkfifo resp ; nc -l -p 80 < respこれは、あるシェルでrootとして実行echo -e "HTTP/1.1 200 OK\r\n\r\nhello :)" > respしてから、別のシェルでrootとして実行することで確認できます。

お役に立てれば。

于 2013-03-19T18:02:47.207 に答える
0

私はsudoを疑う。スクリプトから sudo を削除して、スクリプト全体を sudo しようとしましたか?

ctrl-Z と ps a を試して、何がそれを妨げているかを確認しましたか?

于 2013-03-19T16:59:16.090 に答える