• ベストアンサー

シェルスクリプトを途中からバックグラウンドで動かす方法

フォアグラウンドで起動したシェルスクリプトを、途中から 自動的に バックグラウンドに移行させる方法はないでしょうか。 ユーザーが操作するのなら、もちろん フォアグラウンドで起動→Ctrl Z で中断→jobsでジョブ番号を確認→bg %[ジョブ番号] という手順でできることは知っていますが、 シェルスクリプトが特定の段階まで処理したら自動的に バックグラウンドに移行するようにしたいのです。 たとえば、 #!/bin/sh echo "パラメータを入力してください" read param echo "ここからバックグランドに移行します" #(*) # ここからバックグラウンドに移行して # 処理を行う (バックグランドでやりたい処理) # exit という感じで、処理に必要なパラメーターをターミナルから入力 したいので、最初はフォアグラウンドで起動する必要がありますが、 入力が終わったらあとは邪魔なのでバックグラウンドに回したいのです。 それなら起動時の引数としてパラメーターを与えればいい、と言われ そうですが、パラメーターの数が不定の場合も考えているので、 ターミナル入力が必要なのです。 (*)の部分に jobs; bg %1 などと入れてみましたが line 17: bg: no job control と怒られるだけで、バッググラウンドにはなりませんでした。 指定したPIDのプロセスをバックグラウンドにするような コマンドでもあればうまくいきそうですが、そういう コマンドはないようで、手詰まり状態です。 何かうまい方法がありましたらご教示下さい。 なお、baシェルやCシェルではなく、一番基本的な Bourne Shell で使えるような方法をお願いします。 また、できるだけディストリビューションや OS(Linux、BSD、Solarisなど)の違いにも依存しない 方法をお願いしたいと思います。

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

>無視されるようです。 無視されるのではなく、バックグラウンドで処理しているんですよね? #!/bin/sh echo "a"; (sleep 5 ; echo "b" )& echo "c";

horagai
質問者

補足

>無視されるのではなく、 あぁっ! ……(゜ロ゜;) そのようです。sleep だけバックグラウンドに 回しても意味がなかったですね(^^ゞ ご教示の例のような、複数のコマンドをカッコで まとめてバックグラウンドに回すという方法は初めて知りました(^^ゞ そんなことができたんですね。 もしかしてこれって関数化と同じ? というわけで、バックグラウンドに回したい処理を 関数にまとめて、関数を&つきで呼び出してみたところ うまく行きました。 今回は関数をバックグラウンドで実行する方法で行こうと思います。 ありがとうございました。

その他の回答 (3)

  • damejan
  • ベストアンサー率30% (58/192)
回答No.4

バックグラウンドじゃないけど、screenコマンドを使えば、とりあえず、コンソールとプロセスを切り離せる。 でも、どうしてバックグランドにしたいの? どうしてもバックグラウンドにしなければいけない理由が分からん。 別のterminal立ち上げとけばいいんじゃないの。

horagai
質問者

お礼

ありがとうございます。 screenコマンドも知りませんでしたが、いろいろと便利そう なコマンドですね。あとで使い方を調べておきます。 >別のterminal立ち上げとけばいいんじゃないの。 まあそう言われればその通りなんですが(^^ゞ 個人的な趣味ですが、 ・デスクトップになるべく余計なアイコンやウインドウを置きたくない (タスクバーもランチャーも使ってないくらいですから) ・コンソール画面でも使いたい などの要望もあるもので(^^ゞ

  • OKwebb
  • ベストアンサー率44% (92/208)
回答No.2

バックグランドにしたい処理を別シェルにして、バックグランドで起動すればいいのでは?

horagai
質問者

お礼

ありがとうございます。 その方法でテストして、一応はうまくいきました。 でもやはり、ファイルの数を増やしたくないことと、 不定数パラメーターの引き渡しが面倒な点で, 一つのスクリプトで完結する方法の方が望ましいです。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

たんに&をつけるのではダメなのでしょうか? たとえば・・・ sleep 5 &

horagai
質問者

補足

ありがとうございます。 それではうまくいきません。 シェルスクリプトの中で sleep 60 & などと書くと無視されるようです。

関連するQ&A