私は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、何も起こらず、端末がロックされます。
なんで?私は何を間違っていますか?
私の環境(RHEL)でこれを再現することはできません--CTRL-Cはこれでうまく機能します。端末がロックされたら、新しい端末を開いて、strace -p
何が起こっているかを確認するために使用します。
ただし、コマンドの設定全般には問題があると思います。
まずcat
、サブシェルでバックグラウンドを使用しているということです。 これを行うとstdin
cat
/dev/null
nc
、サブシェルにパイプしている出力ではなく、コマンドが作成されます。これの出力を比較することにより、違いを確認できます。
#! /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として実行することで確認できます。
お役に立てれば。
私はsudoを疑う。スクリプトから sudo を削除して、スクリプト全体を sudo しようとしましたか?
ctrl-Z と ps a を試して、何がそれを妨げているかを確認しましたか?