3

理由もなくプログラムが停止することがあるため、プログラムを無限ループ内で実行しようとしています。ただし、プログラムが再起動されないように Ctrl-C を押したいと思います。

Ctrl-C でプログラムを強制終了させたくありません。プログラムが終了するまで待ってから、再起動しないでください。

theprogramワイン プログラム (utorrent) です。

theprogram右上の「x」をクリックするのと同じように安全に終了するようにする方法を教えてくれたボーナスポイント。コマンド ラインから手動killで実行するか、Ctrl-C キーを押すと、クリーンアップ コードを実行できません。したがって、再起動を停止しようとする私の試み。

SIGINT のトラップに関する他のいくつかの質問を確認しましたが、これを行う方法がわかりませんでした。

誰でもこのコードを修正できますか? 私のコードはtheprogram、Ctrl-C が押されると、theprogramクリーンアップせずに終了してループを終了するようです。

#!/bin/bash

EXIT=0
trap exiting SIGINT

exiting() { echo "Ctrl-C trapped, will not restart utorrent" ; EXIT=1;}

while [ $EXIT -eq 0 ] ; do
        wine theprogram
        echo "theprogram killed or finished"
        date
        echo "exit code $?"
        echo "sleeping for 20 seconds, then restarting theprogram..."
        sleep 20
done

echo "out of loop"
4

4 に答える 4

1

さて、良い解決策が見つからなかったため、質問どおりに Ctrl-C を使用しなくなりましたが、zenityクリックしてループを終了できるボックスをポップアップしていました。

ゼニティ ポップアップ

#!/bin/bash
zenity --info --title "thewineprogram" --text "Hit OK to disable thewineprogram auto-restart" &  # run zenity in the background
zen_pid=$!

while : 
do
    wine <wineprogramlocation>
    EXITCODE=$?
    echo "thewineprog killed or finished"
    echo "exit code was $EXITCODE"
    date

    kill -0 $zen_pid > /dev/null 2>&1  # kill -0 just checks if a pid exists
    if [ $? -eq 1 ] # process does not exist
    then
        break
    fi

    echo "sleeping for 5 seconds, then restarting the wine program..."
    sleep 5     
done

echo "finished"
于 2015-11-05T08:53:11.030 に答える
1

これを試して:

while true
do
  xterm -e wine theprogram || break
  sleep 3
done

トリックは、別の xterm を使用してワインを開始することによって行われます。Ctrl-cそうすれば、ワインは異なる制御 tty を持ち、プレスの影響を受けません。

欠点は、追加の xterm がデスクトップに残ることです。オプション-iconicを使用して、アイコン化して起動できます。

于 2013-11-19T12:43:35.173 に答える
1

監視プロセスを使用します。

これにより、子プロセスに影響を与えることなく、SIGINT シグナルがモニター プロセス トラップ ハンドラーをヒットできるようになります。

(これは、perl、python、または任意の言語でも実行できます)

#!/bin/bash

cmd() {
    trap '' INT
    trap 'echo "Signal USR1 received (pid=$BASHPID)"; EXIT=1' USR1
    EXIT=0
    while [ $EXIT -eq 0 ]
    do
        echo "Starting (pid=$BASHPID)..."
        sleep 5 # represents "wine theprogram"
        echo "theprogram killed or finished"
        date
        echo "Exit code $?"
        if [ $EXIT -eq 0 ]; then
            echo "Sleeping for 2 seconds, then restarting theprogram..."
            sleep 2
        fi
    done
    echo "Exiting (pid=$BASHPID)"
}

run() { cmd & PID=$!; echo Started $PID; }
graceful_exit() { kill -s USR1 $PID && echo "$PID signalled to exit (USR1)"; }
shutdown() { kill -0 $PID 2>/dev/null && echo "Unexpected exit, killing $PID" && kill $PID; }

trap 'graceful_exit' INT
trap 'shutdown' EXIT
run

while :
do
    wait && break
done

echo "Exiting monitor process"
于 2018-01-10T22:20:19.200 に答える