2

やあ。私はシェルに不慣れで、最初の恨みのあるスクリプトに取り組んでいます。私はintertubeとSO全体を読みましたが、、、、が説明されている場所はたくさんありますが、何かdisownがうまくいきません。nohup&return

もっとシンプルなタイマーが欲しいです。スクリプトは、時間、分などのユーザー入力を要求し、次に:

echo "No problem, see you then…"
sleep $[a*3600+b*60+c]

この時点で(1行目または2行目、わかりません)、スクリプトまたはスクリプト内の特定のコマンドをバックグラウンドプロセスにします。多分デーモン?タイマーがスケジュールどおりにオフになるように

  • そのターミナルウィンドウは閉じられています
  • ターミナルアプリは完全に終了します
  • コンピューターがスリープ状態になります(Mac自体をスリープ解除するにはまだ別のコードが必要だと思います)
  • また、「問題なし」の行の後にreturn、既存のシェルウィンドウがその間も引き続き役立つようにコマンドが必要です。

    terminal-notifierコマンド(タイマーウェイクアップ)は、上記の特定の使用法(現時点ではどちらかを思い出せません)の直後に呼び出され、適切なタイミングで2回目の通知が行われます。return基本的にどこでもコマンドを使用すると、スクリプトが終了するようです。

    私がはっきりしていないことの1つは、コマンドプロセスとスクリプトプロセスに適用できるかどうかdisown、どのように適用できるか、つまり、スクリプト内のコマンドでのみ適切に機能するかどうかです(そうでない場合は、どのように機能するか)。nohupまだ入力を要求するバックグラウンドプロセスとしてスクリプトを初期化します)。

    多分私はいくつかの代替手段を使用する必要がありますかsleep

    4

    2 に答える 2

    5

    スクリプトの一部をバックグラウンドで実行するために、別のスクリプトを使用したり、スクリプト自体を実行したりする必要はありません。

    より簡単な方法は、バックグラウンドにしたい部分(スリープおよび次のコマンド)を括弧内に配置し、それらの後にアンパサンドを配置することです。

    したがって、スクリプトの終わりは次のようになります。

    (
      sleep $time
      # Do whatever
    )&
    

    これにより、コードのその部分がバックグラウンドに配置されたサブシェル内で実行されます。その後はコードがないため、最初のシェルはすぐに終了して、インタラクティブシェルに制御を戻します。

    于 2012-10-24T23:07:27.063 に答える
    0

    スクリプトを実行すると、実際には新しいシェルを起動してスクリプトを実行することで実行されます。スクリプトをバックグラウンドに取り込むには、そのシェルをバックグラウンドに送信する必要がありますが、親シェルと通信する必要があるため、これを行うことはできません。

    あなたができることは、スクリプトが仕事をするべきであることを示すために特別な引数でそれ自身を呼び出すようにすることです:

    #! /bin/zsh
    if [ "$1" != '--run' ] ; then
        echo sending to background
        $0 --run $@ &
        exit
    fi
    sleep 1
    echo backgrounded $@
    

    このスクリプトは、最初に最初の引数がであるかどうかを確認します--run。そうでない場合は、$0その引数と$@バックグラウンドで受け取った他のすべての引数()を使用して自分自身()を呼び出し、終了します。同様の方法を使用して、バックグラウンドを入力するときにテストを実行し、すべての引数の代わりに必要なデータを送信することもできます。たとえば、秒数だけを送信するには、次のようにします。

    $0 --run $[a*3600+b*60+c] &
    
    于 2012-10-22T20:14:19.833 に答える