次のように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ファイルを作成したくありません。どうすれば修正できますか?
別の解決策:
function background {
echo TEST
}
export -f background
Nohup bash -c background &
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
私は実用的な解決策を見つけました-関数をファイルで定義します(例:.functions
)次に、Nohupで関数を実行します。
Nohup bash -c "source .functions; function1" &
Ubuntu 13.04でテスト済み。
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
が呼び出されますはい !ただし、トリッキーで厳密に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であることを忘れないでください(私はこれに完全に同意しません)。
ファイルに合わせて調整されたNohupを使用する代わりに、次のように同じ結果を実装できます。
(trap '' HUP INT
while true
do
echo "function1"
sleep 1
done
) </dev/null 2>&1 1>Nohup.out &
親スクリプトからこれらのプロセスを起動する傾向があり、親プロセスが中断された場合、親スクリプトが他の作業を行う可能性があるため、子プロセスにINT信号を無視させ、実行を継続させたい。