0

ユーザーが切断されても実行を継続するが、ユーザーが Ctrl+C を押すと中止できる bash スクリプトを作成したいと考えています。

最初の部分は次のように解決できます。

#!/bin/bash
cmd='
#commands here, avoiding single quotes...
'
nohup bash -c "$cmd" &
tail -f nohup.out

ただし、明らかに Ctrl+C を押すとtail、本体ではなくプロセスが強制終了されます。両方できますか?たぶんスクリーンを使用していますか?

4

3 に答える 3

1

ユーザーが切断されても実行を継続するが、ユーザーが Ctrl+C を押すと中止できる bash スクリプトを作成したいと考えています。

これはまさにあなたが定式化した質問に対する答えだと思います。これはスクリーンのないものです:

#!/bin/bash
cmd=`cat <<EOF
# commands here
EOF
`
nohup bash -c "$cmd" &

# store the process id of the nohup process in a variable
CHPID=$!        

# whenever ctrl-c is pressed, kill the nohup process before exiting
trap "kill -9 $CHPID" INT

tail -f nohup.out

ただし、 nohup は信頼できないことに注意してください。呼び出し元のユーザーがログアウトすると、nohup もすぐに終了する可能性があります。その場合、disownの方が効果的です。

bash -c "$cmd" &
CHPID=$!
disown
于 2013-11-14T17:34:53.100 に答える
1

これはおそらく screen を使用した最も単純な形式です:

screen -S SOMENAME script.sh

次に、切断された場合は、再接続時に次を実行します。

screen -r SOMENAME

Ctrl+C期待どおりに動作し続ける必要があります

于 2013-11-14T01:36:32.573 に答える
1

事実 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か?)

于 2013-11-14T04:50:37.197 に答える