Tarefa de inicialização do sistema na reinicialização do sistema

3

Estou usando trabalhos de instância inicial para iniciar alguns dos meus serviços. As tarefas são destinadas a ter uma instância por usuário, ou seja, elas usam o nome do usuário como o parâmetro da instância. Eu também os configurei para serem reconhecidos por upstart. O respawning funciona. Aqui está o meu arquivo de configuração

start on runlevel [2345]
stop on runlevel [06]

normal exit 0

respawn
respawn limit 5 300
instance $user

chdir /home/talha/syncservice/
script
   exec python sync.py $user
end script

O problema é que eu quero que esses trabalhos de instância sejam reiniciados na reinicialização do sistema. Obviamente, não posso passar em todos os nomes de usuários como os parâmetros da instância na reinicialização, pois não sei o que e quantas instâncias foram geradas da última vez.

Existe uma maneira pela qual o upstart pode persistir em suas tabelas de estado para tarefas de instância entre reinicializações. Por que eu suponho que há alguma "tabela de estado" ?, é porque eu suponho que o upstart mantém um controle de todos os trabalhos da instância em execução. Haveria uma tabela de estados que rastreia qual instância reaparecer quando ela falhar. Caso contrário, não será capaz de reaparecer um trabalho de instância. Então, se essas tabelas puderem se tornar persistentes nas reinicializações, meu problema será resolvido.

A persistência pode ser conseguida de alguma forma? Onde o upstart mantém o controle de seus trabalhos em execução? É só na memória ou num arquivo?

Se isso não pode ser feito, isso significa que a estrofe

start on runlevel[2345]

não tem significado ou benefício, por exemplo, empregos.

    
por auny 04.02.2014 / 08:00

2 respostas

1

Você pode salvar a lista de usuários em um arquivo (user-sync.list neste exemplo). Para restaurar os scripts de usuário, você pode usar um loop for em um script bash que é executado pelo root na inicialização. Onde seu script de inicialização é chamado de sincronização do usuário:

#!/bin/sh
# /root/restore-user-sync.sh
for user in 'cat user-sync.list'; do start user-sync user=$user; done

Adicione isso ao crontab, como root:

$ crontab -e

No arquivo cron:

@reboot /root/restore-user-sync.sh

Manter a lista de usuários ativos é a parte mais envolvida. Você poderia ter o script python fazendo isso, ou você poderia fazê-lo como parte do script Upstart:

# /etc/init/user-sync.conf

start on runlevel [2345]
stop on runlevel [06]

normal exit 0

respawn
respawn limit 5 300
instance $user

chdir /home/talha/syncservice/

pre-start script
    # if $user doesn't already exist in list, add $user to list
    if ! grep $user user-sync.list; then echo $user >> user-sync.list; fi
end script

script
   exec python sync.py $user
end script

pre-stop script
    # remove line(s) from list that exactly match $user
    sed -i "/\b$user\b/d" user-sync.list
end script

Você pode substituir $ USER (que é definido automaticamente como o nome de usuário atual) por $ user, caso contrário, ao chamar o script upstart, será necessário passar o nome de usuário como parâmetro:

sudo start user-sync user=myusername
    
por thinkmassive 11.02.2014 / 04:10
1

Eu definitivamente gostaria de ficar longe do capô do novato. Você pode fazer isso de outra maneira.

A seção do Cookbook na sub-instância da instância tem um exemplo de como fazer coisas como essa. Eu faço algo assim com várias instâncias do PostgreSQL; veja esta resposta.

A ideia básica aqui é criar o que eu chamo de job "pony engine" que inicia todos os trabalhos da sua instância. No seu caso, você pode fazer uma iteração pelos subdiretórios de /home ou manter um arquivo conf separado que lista os usuários para os quais deseja que o serviço seja executado. Para cada usuário, inicie uma instância sync.py.

Você está certo de que start on / stop on é inútil no trabalho de instância. Mova-o para o trabalho "pony engine".

Infelizmente, não tenho acesso a uma caixa do Linux agora, mas veja a resposta acima para exemplos.

    
por Brian.D.Myers 05.02.2014 / 21:13