重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

Linux+Perlでのお話です。

内部でsystem関数を使ってrshコマンドを実行しているperlスクリプト(以下、スクリプトAという)があります。
スクリプトAをフォアグラウンドで実行するとうまく流れるのですが、バックグラウンド実行すると、rshコマンドを実行した直後でjobが止まってしまいます。

もっと詳しく言いますと、スクリプトAのrshコマンドは、ディスクを共有しているリモートマシンに対して、スクリプトBを実行するように指示しています。
スクリプトBではとある計算を行なっており、その計算結果をファイルに出力しています。
そして、その結果をスクリプトAで読み込んで後処理を行うというものです。

-----
…(前処理)…

system("rsh (ホスト名) \"(スクリプトB実行コマンド及び引数) 1> /dev/null 2> /dev/null\"");

# ここでjobが止まってしまいます。

# ここで標準出力(ログファイルにリダイレクトしてる)に何か出力しようとしても、何も出力されてません。

(スクリプトBの結果ファイルの読み込み)

…(後処理)…
-----

Jobが止まってしまうと言っているのは、jobsコマンドで見ると"job stopped"となっている状態のことを言っています。

この状態でスクリプトBの結果はファイルに出力されているので、rshのコマンドはうまく投げられていると思います。
(「rshやsshは標準入力が期待されてるとバックグラウンド実行が出来ない」(?)というような記述をどこかで見かけたので、念のためrshに"< /dev/null"の記述を加えてもみたのですが、変わりませんでした)

その後、止まっているjobをfgコマンドでフォアグラウンドで再開させると、最後まで問題なく実行されます。


フォアグラウンドで実行すればうまくいくのに、バックグラウンドで実行すると止まってしまうのが理解出来ません。
これは何が原因なのでしょうか。
そして、どうしたら解決出来るのか。

どなたかご存知でしたら、ご教示頂きたくお願い致します。

A 回答 (2件)

n オプションをけると上手くいくかも



http://linuxjm.sourceforge.jp/html/netkit/man1/r …
csh(1) を使用している場合に、 rsh の入力を端末にリダイレクトしたままバックグラウンドで動作させると、リモートコマンドから入力がない場合でも rsh は動作をブロックする。入力が必要ない場合は、 -n オプションを用いて rsh の入力を /dev/null にリダイレクトするべきである。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

まさに、ご指摘頂いたとおりの内容だったようで、rshに-nオプションを加えることで、途中でスクリプトが停止することなくバックグラウンドで実行することが出来ました。

やはり「rshやsshは標準入力が期待されてるとバックグラウンド実行が出来ない」ということだったのですね…
rshで実行させたスクリプトの結果がファイルに書き出されていたので、てっきり問題ないものだと思い込んでました。

非常に助かりました。ありがとうございました。

今後とも宜しくお願い致します。

お礼日時:2011/05/27 10:24

rsh先に ~/.bashrcや~/.cshrcなどのシェル起動時に自動実行されるファイルがあって、


その中に sttyコマンドやxmodemapなどの端末依存するコマンドが書いてあると、
そこで処理待ちになってしまった経験があります。

私は、.chsrcで
if ( $?term ) then
stty ~
endif
として回避しました。
(.bashrcはまた別の書き方)
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

今回は、rshに-nオプションをつけることで、途中で止まることなくバックグラウンドで実行されました。

今回はご指摘頂いた事象に該当するものではなかったみたいですが、今後の参考にさせて頂きます。

今後とも宜しくお願い致します。

お礼日時:2011/05/27 10:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

今、見られている記事はコレ!