web-dev-qa-db-ja.com

複数のパラメーターを起動する

だから私は新興プロセスに取り組んでおり、複数のパラメータを渡すことができるかどうかを知りたい

my-upstart-service restart PARM1=foo PARM2=bar PARM3=hello

ここに私が念頭に置いていたものがあります

description "Multi Parm"

env USER=BLARG

start on startup
stop on shutdown

respawn

instance $PARM1
instance $PARM2
instance $PARM3

env P1=${PARM1}
env P2=${PARM2}
env P3=${PARM3}

script
    exec Sudo -u $USER sh -c "$P1/$P2/$P3.sh"
end script

このようなことはできますか?

2
Phill Pafford

はい、複数のenv変数を定義し、コマンドラインから上書きすることもできます。

例えば:

  description "Multi Parm"

  env USER=BLARG

  start on startup
  stop on shutdown

  env PARM1=foo
  env PARM2=bar
  env PARM3=hello

  script
     exec Sudo -u $USER sh -c "/$PARM1/$USER/PARM2/$PARM3.sh"
  end script

サービスを開始できるより:

  initctl start your-service PARM1=home PARM2=bin PARM3=yourScript

instance スタンザをどのように使用するかはわかりません。ジョブの複数のインスタンスを開始する必要がある場合、この例を変更できます。

  description "Multi Parm"

  env USER=BLARG

  start on startup
  stop on shutdown

  respawn

  instance $PARM1
  script
     exec Sudo -u $USER sh -c "/home/$USER/bin/$PARM1.sh"
  end script

したがって、異なる値の$ PARM1で複数回実行できます。

  initctl start your-service PARM1=my-first-script
  initctl start your-service PARM1=my-second-script

6.15.2別のインスタンスの例 をご覧ください。workerジョブを定義する方法と、workersジョブとは異なるインスタンスとして複数回実行する方法の例があります。

UPDATE以下はlubuntu 12.04でテストされた例です。

最初に、simpleInstanceJob.confを指定されたパラメーターでスクリプトを実行するだけのジョブを定義します。これはstart onおよびstop onスタンザのないジョブであるため、upstart initプロセスによる開始/停止ではありません。

# SimpleInstanceJob - 
#
# This service runs for ever and print number and arguments
description "Run single job instance"
instance $ENVIRONMENT/$DRIVER/$ALGORITHM
console log
respawn
script
  exec  python /home/caterina/tmp/upstart/test.py $ENVIRONMENT $DRIVER $ALGORITHM 
end script

/etc/initに入れて、テストしてください:

Sudo start simpleInstanceJob ENVIRONMENT=foo DRIVER=bar ALGORITHM=fooBar 

initctlを使用してステータスジョブを表示します。

initctl list | grep simpleInstanceJob

これは出力されます:

simpleInstanceJob (foo/bar/fooBar) start/running, process 3828

およびtest.py出力は/var/log/upstart/simpleInstanceJob-foo_bar_fooBar.logに保存されます

つかいます:

Sudo stop simpleInstanceJob ENVIRONMENT=foo DRIVER=bar ALGORITHM=fooBar 

simpleInstanceJobの「foo/bar/fooBar」インスタンスを停止/強制終了します。

simpleInstanceJobの複数のインスタンスを実行するには、launcherJobs.confを作成します。

# laucherJobs - 
#
# This service runs three instance of simpleInstanceJob
# starts on runlevel.
description "laucherJobs"
start on runlevel [2345]

stop on runlevel [016]
console log

pre-start script

    start simpleInstanceJob ENVIRONMENT=foo DRIVER=bar ALGORITHM=fooBar
    start simpleInstanceJob ENVIRONMENT=foo1 DRIVER=bar1 ALGORITHM=fooBar1
    start simpleInstanceJob ENVIRONMENT=foo2 DRIVER=bar2 ALGORITHM=fooBar2

end script

post-stop script
    for inst in `initctl list|grep "^simpleInstanceJob "|awk '{print $2}'|tr -d ')'|tr -d '('`
    do
       environment=`echo $inst | awk -F "/" '{print $1}'`
       driver=`echo $inst | awk -F "/" '{print $2}'`        
       algorithm=`echo $inst | awk -F "/" '{print $3}'`
       stop simpleInstanceJob ENVIRONMENT=$environment DRIVER=$driver ALGORITHM=$algorithm 
    done
end script

この「master」ジョブにはメインexecまたはスクリプトセクションがありません。「slave "または子(個別の" simpleInstanceJob ")ジョブインスタンスが実行されます。

/etc/initに入れて、テストしてください:

Sudo start laucherJobs

これにより、simpleInstanceJobの3つのインスタンスが開始されます。

initctl list | grep Job

出力されます:

simpleInstanceJob (foo/bar/fooBar) start/running, process 3745
simpleInstanceJob (foo2/bar2/fooBar2) start/running, process 3749
simpleInstanceJob (foo1/bar1/fooBar1) start/running, process 3747
launcherJobs start/running

最後に、すべてのプロセスを停止します。

Sudo stop laucherJobs

これが問題の解決に役立つことを願っています。

5
Lety

あなたはこれを行うことができます:

start on startup
stop on runlevel [016]

instance $PARM1/$PARM2/$PARM3

setuid BLARG

respawn
exec ${UPSTART_INSTANCE}.sh
1
CameronNemo