プロが教えるわが家の防犯対策術!

フォアグラウンドで起動したシェルスクリプトを、途中から
自動的に
バックグラウンドに移行させる方法はないでしょうか。

ユーザーが操作するのなら、もちろん

フォアグラウンドで起動→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など)の違いにも依存しない
方法をお願いしたいと思います。

A 回答 (4件)

たんに&をつけるのではダメなのでしょうか?



たとえば・・・
sleep 5 &

この回答への補足

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

補足日時:2009/06/10 16:52
    • good
    • 0

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

    • good
    • 0
この回答へのお礼

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

お礼日時:2009/06/10 22:21

>無視されるようです。



無視されるのではなく、バックグラウンドで処理しているんですよね?

#!/bin/sh

echo "a";
(sleep 5 ; echo "b" )&
echo "c";

この回答への補足

>無視されるのではなく、

あぁっ! ……(゜ロ゜;)
そのようです。sleep だけバックグラウンドに
回しても意味がなかったですね(^^ゞ

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

補足日時:2009/06/10 22:50
    • good
    • 0

バックグラウンドじゃないけど、screenコマンドを使えば、とりあえず、コンソールとプロセスを切り離せる。



でも、どうしてバックグランドにしたいの?
どうしてもバックグラウンドにしなければいけない理由が分からん。
別のterminal立ち上げとけばいいんじゃないの。
    • good
    • 0
この回答へのお礼

ありがとうございます。
screenコマンドも知りませんでしたが、いろいろと便利そう
なコマンドですね。あとで使い方を調べておきます。

>別のterminal立ち上げとけばいいんじゃないの。

まあそう言われればその通りなんですが(^^ゞ
個人的な趣味ですが、
・デスクトップになるべく余計なアイコンやウインドウを置きたくない
(タスクバーもランチャーも使ってないくらいですから)
・コンソール画面でも使いたい
などの要望もあるもので(^^ゞ

お礼日時:2009/06/10 23:26

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