Sim, é possível definir várias variáveis env
e substituí-las na linha de comando.
Por exemplo:
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
Do que você pode começar seu serviço:
initctl start your-service PARM1=home PARM2=bin PARM3=yourScript
Não está claro como você usaria a sub-rotina instance . Se você precisar iniciar várias instâncias do seu trabalho, poderá alterar este exemplo:
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
Assim, você pode executá-lo várias vezes com um valor diferente de $ PARM1:
initctl start your-service PARM1=my-first-script
initctl start your-service PARM1=my-second-script
Dê uma olhada no 6.15.2 Outro Exemplo de Instância há um exemplo de como definir um trabalho worker
e como executá-lo várias vezes como instância diferente do trabalho workers
.
UPDATE Aqui está um exemplo testado no lubuntu 12.04.
Primeiro, defina simpleInstanceJob.conf
uma tarefa que simplesmente executa seu script com determinados parâmetros. Este é um trabalho sem a sub-rotina start on
e stop on
, portanto, não é iniciado / interrompido pelo processo inicial do upstart.
# 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
Coloque em /etc/init
e teste com:
sudo start simpleInstanceJob ENVIRONMENT=foo DRIVER=bar ALGORITHM=fooBar
Use initctl
para ver o trabalho de status:
initctl list | grep simpleInstanceJob
esta saída:
simpleInstanceJob (foo/bar/fooBar) start/running, process 3828
e test.py
de saída serão salvos em /var/log/upstart/simpleInstanceJob-foo_bar_fooBar.log
Uso:
sudo stop simpleInstanceJob ENVIRONMENT=foo DRIVER=bar ALGORITHM=fooBar
para interromper / matar " foo/bar/fooBar
" instância de simpleInstanceJob
.
Para executar várias instâncias de simpleInstanceJob
, crie um 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 }'|tr -d ')'|tr -d '(''
do
environment='echo $inst | awk -F "/" '{print }''
driver='echo $inst | awk -F "/" '{print }''
algorithm='echo $inst | awk -F "/" '{print }''
stop simpleInstanceJob ENVIRONMENT=$environment DRIVER=$driver ALGORITHM=$algorithm
done
end script
Este trabalho " master " não tem seção exec ou script principal, ele será executado (sem um pid) pela duração que o " slave " ou filhos (individual) as instâncias do job "simpleInstanceJob") são executadas.
Coloque em /etc/init
e teste com:
sudo start laucherJobs
Isso iniciará três instâncias de simpleInstanceJob:
initctl list | grep Job
produzirá:
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
Finalmente, para interromper todo o processo:
sudo stop laucherJobs
Espero que isso seja útil para resolver seu problema.