Tarefa de inicialização da instância na reinicialização do sistema

Tarefa de inicialização da instância na reinicialização do sistema

Estou usando trabalhos de instância inicial para iniciar alguns dos meus serviços. Os trabalhos devem ter uma instância por usuário, ou seja, eles usam o nome do usuário como parâmetro da instância. Eu também os configurei para serem respawnados pelo iniciante. O reaparecimento funciona. Aqui está a aparência do 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 quero que esses trabalhos de instância sejam reiniciados na reinicialização do sistema. Obviamente, não posso passar todos os nomes de usuário como parâmetros de instância na reinicialização, pois não sei quais e quantas instâncias foram geradas da última vez.

Existe uma maneira de o iniciante persistir suas tabelas de estado, por exemplo, trabalhos durante as reinicializações. Por que presumo que exista alguma "tabela de estado"? É porque presumo que o iniciante mantém um controle de todos os trabalhos de instância em execução. Haveria uma tabela de estado que rastreia qual instância reaparecerá quando ela travar. Caso contrário, não será possível reaparecer um trabalho de instância. Portanto, se essas tabelas puderem se tornar persistentes durante as reinicializações, meu problema será resolvido.

A persistência pode ser alcançada de alguma forma.? Onde a novata mantém o controle de seus trabalhos em execução? Está apenas na memória ou em um arquivo?

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

start on runlevel[2345]

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

Responder1

Você pode salvar a lista de usuários em um arquivo (user-sync.list neste exemplo). Para restaurar os scripts do usuário, você pode usar um loop for em um script bash executado pelo root na inicialização. Onde seu script de inicialização é chamado de sincronização de 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 complicada. Você pode fazer com que o script python faça isso ou 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 inicial, você precisará passar o nome de usuário como parâmetro:

sudo start user-sync user=myusername

Responder2

Eu definitivamente evitaria ficar sob o capô do novato. Você pode fazer isso de outra maneira.

OSeção do livro de receitas sobre a estrofe da instânciatem alguns exemplos de como fazer coisas assim. Eu faço algo assim com várias instâncias do PostgreSQL; veresseresponder.

A ideia básica aqui é criar o que chamo de trabalho de "motor pônei" que inicia todos os seus trabalhos de instância. No seu caso, você pode iterar pelos subdiretórios de /homeou 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 da instância. Mova-o para o trabalho "pony engine".

Infelizmente não tenho acesso a uma caixa Linux no momento, mas veja a resposta mencionada acima para obter exemplos.

informação relacionada