system management
1752732 メンバー
6255 オンライン
108789 解決策
新規ポスト

リモートシェルでnohupを送る

 
cube
アドバイザー

リモートシェルでnohupを送る

フォーラム参加者様お世話になっております。

ServerAからServerBの/etc/hoge.shをリモートシェルで動かしたいと思います。その際nohupを使って動かしたいと思いますが、以下の例では失敗しました。

/usr/bin/remsh ServerB -l user1 -n nohup /etc/hoge.sh &

以上の問題の回避方法をご存じの方、ご教授の程よろしくお願いします。

5件の返信5
nadachi
レギュラーアドバイザー

リモートシェルでnohupを送る

誤解していなければ、"nohup" はリモート(ServerB)で動かすおつもりのようです。そうだとすると、

man remsh にある例、

---

以下のコマンド行により、 remsh は、

リモート・コマンドが終了するのを待たずに即座に戻ります。

remsh otherhost -n "command 1>&- 2>&- &"

---

にならって、

remsh ServerB -l user1 -n "nohup /etc/hoge.sh 1>&- 2>&- &"

とするのはどうでしょうか。

hazelwood
信頼あるコントリビューター

リモートシェルでnohupを送る

何が問題なのかよく理解できていません。

並列処理をさせたいのであれば、remsh自体を

バックグラウンドで動作させているので(最後の"&"は

ローカルのシェルが解釈しますので)、

実行したターミナルを閉じる、ローカルマシンを

シャットダウンするなどの操作が無ければ、

このままでも問題ないと思います。

remshプロセスが残ることが問題ならば、remshは

オープンされているセッションがすべて閉じる

まで終了しませんので、stdin, stdout, stderr

すべてをremsh<-->remshdのセッションから切り離す

必要があります。

stdinは-nオプションで/dev/nullにリダイレクト

できますが、stdout, stderrは、nadachiさんの

回答の通りクローズするか、/dev/nullなどへの

リダイレクトを行う必要があります。

(なお、このクローズの記法はPOSIX shellのものです。

リモートのログインシェルがcshの場合は、クローズ

できないようなので、>&/dev/nullでstdout, stderrの

両方をリダイレクトする必要があります。)
cube
アドバイザー

リモートシェルでnohupを送る

ご返信ありがとうございます。

hoge.shの中身はjavaを起動させるプログラムになります。

通常メンテナンスなどでプログラムを単体で起動する際ServerBで nohup /etc/hoge.sh & で起動しています。

今回の目的はOmnibackでbackupを取得する際、hoge.shのプロセスをリモートシェルで停止/起動させることが目的です。

【ServerA(Omni Sever)から ServerBへリモートシェルをつかって】

1.omniback pre-execでhoge.shのプログラムを停止。

2.omnibackでbackup取得

3.omnibak post-execでhoge.shを起動。

ご返信いただいた内容で私が解釈すると、remshで起動する限り、とくに "&" は必要なく

/usr/bin/remsh ServerB -l user1 -n nohup /etc/hoge.sh を行えばよいのでしょうか?(ありはnohupはいらない?)

大変お手数ですが、ご教授の程よろしくお願いします。

hazelwood
信頼あるコントリビューター

リモートシェルでnohupを送る

つまり、3. のpost-execからリモートのhoge.shを起動させる方法についてですね?

結論から先に言うと、

「remsh ServerB -l user1 -n "nohup /etc/hoge.sh >/var/tmp/log 2>&/var/tmp/log &"」(posix-shell, ksh)

か、

「remsh ServerB -l user1 -n "nohup /etc/hoge.sh >&/var/tmp/log &"」(csh)

のどちらかがよろしいかと思います。

(ファイルにリダイレクトしているのは、好みの問題です。エラーメッセージなどが後で参照できたほうが言いと思うので。または、hoge.shがjavaプログラムを起動する際にクローズしてもいいと思います。)

そのほかのパターンについては、それぞれ問題があります。

まず、「remsh ... nohup hoge.sh」とすると、hoge.shが終了しないかぎり、remshも終了せず、post-execのタイムアウトが発生します。

「remsh ... nohup hoge.sh &」では、post-execに定義した処理(スクリプト)は終了しますが、(多分)post-execのタイムアウトが発生します。

これは、OmniBackがpost-execスクリプトからのメッセージを得るためにパイプ(?)を使っていますが、これがクローズされないと、post-execが終了したと判断しないためです。

このパイプはそのままremshにも引き継がれますので、remshが終了しないとクローズされません。

「remsh ... "nohup hoge.sh &"」では、hoge.shがstdout, stderrをクローズしてくれないとremshが終了しないので、post-execが終了せず、タイムアウトする可能性があります。
cube
アドバイザー

リモートシェルでnohupを送る

hazelwoodさん

実は「remsh ... nohup hoge.sh」でタイムアウトが発生していました。

回答いただいた内容大変参考になりました。

ありがとうございました。