web-dev-qa-db-ja.com

nohupを使用して関数を呼び出す

次のようにNohupを使用して関数を呼び出そうとしています:

function1(){
    while true 
    do
        echo "function1"
        sleep 1
    done
}

Nohup function1 & 
# ...... some other code

しかし、関数がNohupで認識されていない可能性があり、次のエラーが発生します。

Nohup: failed to run command `function1' : No such file or dictionary

関数用に新しいshファイルを作成したくありません。どうすれば修正できますか?

18
sajad

別の解決策:

function background {
    echo TEST
}
export -f background 

Nohup bash -c background &
15
user7813184

Nohupはコマンドに適用され、スクリプト関数には適用されません。

たとえば、function1()を含むスクリプト(たとえばfunc.sh)はfunction-:を呼び出す必要があります。

function1(){
    while true 
    do
        echo "function1"
        sleep 1
    done

}

function1

次に、バックグラウンドでNohupを指定してスクリプトfunc.shを呼び出します。

Nohup ./func.sh &

スクリプト内からハングアップ信号を無効にする必要がある場合は、組み込みのシェルtrapを使用します。この例はSIGHUPを無視しますが、他のもの(SIGINTなど)を無視するために使用できます。

trap "" HUP   # script will ignore HANGUP signal
6
suspectus

私は実用的な解決策を見つけました-関数をファイルで定義します(例:.functions)次に、Nohupで関数を実行します。

Nohup bash -c "source .functions; function1" &

Ubuntu 13.04でテスト済み。

5
Lachezar

Nohupには、回避策として関数ではなくファイル名を指定する必要があるため、次のように実行できます。

function1(){
    while true 
    do
        echo "function1"
        sleep 1
    done

}

echo "$@" | grep -q -- "--Nohup" && function1 || Nohup $0 "$@" --Nohup & 

したがって、このスクリプトが現在の引数で呼び出されると、次のようになります。

  • `echo "$@" | grep -q -- "--Nohup"はエラーステータスを返すため、
  • Nohup $0 "$@" --Nohup &が呼び出され、現在の引数と新しい引数を渡してこのスクリプトが呼び出されます--Nohup

そして、このスクリプトが引数--Nohupで呼び出されたとき

  • `echo "$@" | grep -q -- "--Nohup"はゼロのステータス(成功)で戻るため、
  • function1が呼び出されます
4
Adam Siemion

はい !ただし、トリッキーで厳密にbash> v2互換にすることもできます。

function1(){ local msg=${*:-function1}; echo msg=$msg; }
Nohup -- sh -c "$(typeset -f function1); function1 MESSAGE" >Nohup.log 2>&1 0</dev/null &

そして、「typeset」は「declare」を支持して非推奨にされたbashであることを忘れないでください(私はこれに完全に同意しません)。

2
scavenger

ファイルに合わせて調整されたNohupを使用する代わりに、次のように同じ結果を実装できます。

(trap '' HUP INT
 while true
 do
   echo "function1"
   sleep 1
 done
) </dev/null 2>&1 1>Nohup.out &

親スクリプトからこれらのプロセスを起動する傾向があり、親プロセスが中断された場合、親スクリプトが他の作業を行う可能性があるため、子プロセスにINT信号を無視させ、実行を継続させたい。

0
James Carey