事実 1 : 端末 (xterm など) が閉じられると、シェルはそこで実行されているすべてのプロセスに SIGHUP (「ハングアップ」) を送信することになっています。これはアナログ モデムの時代にまでさかのぼります。オンライン中に母親がたまたま電話に出た場合、プログラムは自分自身をクリーンアップする必要がありました。信号がトラップされる可能性があるため、特別な機能がクリーンアップを実行できます (ファイルを閉じる、一時的なジャンクを削除するなど)。アナログ モデムの代わりにソケットと SSH トンネルを使用しているにもかかわらず、「接続を失う」という概念は依然として存在します。(概念は変わりません。変化するのは、それらを実装するために使用するテクノロジだけです。)
事実 2Ctrl : -の効果はC、端末の設定によって異なります。通常は SIGINT を送信しますが、シェルで実行して「 intrstty -a
」を探すことで確認できます。
これらの事実は、bash のtrap
コマンドを使用して有利に利用できます。たとえば、これをウィンドウで実行してから、Ctrl-C を押して の内容を確認し/tmp/trapped
ます。次に、もう一度実行し、ウィンドウを閉じて、次の内容を再度確認します/tmp/trapped
。
#!/bin/bash
trap "echo 'one' > /tmp/trapped" 1
trap "echo 'two' > /tmp/trapped" 2
echo "Waiting..."
sleep 300000
man signal
シグナルの情報については、 (FreeBSD または OSX) またはman 7 signal
(Linux)ができるはずです。
(ボーナスポイントについて: 事実に番号を付けた方法を参照してください。理由がわかりましたか?)
だから...あなたの質問に。切断を「生き残る」ために、スクリプトが SIGHUP をトラップしたときに実行される動作を指定する必要があります。
(おまけの質問 #2: 名前の由来はわかりましたnohup
か?)