新贵多个参数

Phi*_*ord 2 init.d upstart services 12.04

所以我正在研究一个新贵的过程,想知道我是否可以传入多个参数

my-upstart-service restart PARM1=foo PARM2=bar PARM3=hello
Run Code Online (Sandbox Code Playgroud)

这就是我的想法

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
Run Code Online (Sandbox Code Playgroud)

我可以做这样的事情吗?

Let*_*ety 5

是的,可以定义多个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
Run Code Online (Sandbox Code Playgroud)

比你可以开始你的服务:

  initctl start your-service PARM1=home PARM2=bin PARM3=yourScript
Run Code Online (Sandbox Code Playgroud)

我不清楚您将如何使用实例节。如果您需要启动多个作业实例,您可以更改此示例:

  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
Run Code Online (Sandbox Code Playgroud)

因此,您可以使用不同的 $PARM1 值多次运行它:

  initctl start your-service PARM1=my-first-script
  initctl start your-service PARM1=my-second-script
Run Code Online (Sandbox Code Playgroud)

看一下6.15.2 Another Instance Example有一个关于如何定义一个worker作业以及如何作为与workers作业不同的实例多次运行它的例子。

更新 这是在 lubuntu 12.04 上测试的示例。

首先定义simpleInstanceJob.conf一个使用给定参数运行脚本的作业。这是没有工作start onstop on节,所以它不是开始/停止由暴发户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
Run Code Online (Sandbox Code Playgroud)

将其放入/etc/init并使用以下命令进行测试:

sudo start simpleInstanceJob ENVIRONMENT=foo DRIVER=bar ALGORITHM=fooBar 
Run Code Online (Sandbox Code Playgroud)

使用initctl查看状态工作:

initctl list | grep simpleInstanceJob
Run Code Online (Sandbox Code Playgroud)

这将输出:

simpleInstanceJob (foo/bar/fooBar) start/running, process 3828
Run Code Online (Sandbox Code Playgroud)

并且test.py输出将保存在/var/log/upstart/simpleInstanceJob-foo_bar_fooBar.log

用:

sudo stop simpleInstanceJob ENVIRONMENT=foo DRIVER=bar ALGORITHM=fooBar 
Run Code Online (Sandbox Code Playgroud)

以停止/杀“ foo/bar/fooBar”的实例simpleInstanceJob

为了运行多个实例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
Run Code Online (Sandbox Code Playgroud)

这个“”作业没有主要的 exec 或脚本部分,它将在“”或子(单个“simpleInstanceJob”)作业实例运行的持续时间内运行(没有 pid)。

将其放入/etc/init并使用以下命令进行测试:

sudo start laucherJobs
Run Code Online (Sandbox Code Playgroud)

这将启动 simpleInstanceJob 的三个实例:

initctl list | grep Job
Run Code Online (Sandbox Code Playgroud)

将输出:

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
Run Code Online (Sandbox Code Playgroud)

最后停止所有进程:

sudo stop laucherJobs
Run Code Online (Sandbox Code Playgroud)

希望这有助于解决您的问题。