Como faço para configurar o upstart para executar um script no desligamento quando o processo leva mais de 10 segundos?

11

Estou executando o ubuntu 11.10 em uma máquina virtual (VirtualBox) para aprender mais sobre o desenvolvimento no linux. Estou usando um repositório git para salvar meu trabalho e escrevi um script para agrupar meu trabalho e salvá-lo na pasta compartilhada para uso enquanto a máquina virtual não está em execução.

Gostaria de executar automaticamente esse script antes do desligamento, para que meu trabalho esteja sempre disponível se a vm estiver desativada (atualmente, preciso executar manualmente o script).

Não sei se o iniciante é a melhor maneira de fazer isso, mas esta é a configuração que escrevi como teste:

description     "test script to run at shutdown"

start on runlevel [056]

task

script
touch /media/sf_LinuxEducation/start
sleep 15
touch /media/sf_LinuxEducation/start-long
end script

pre-start script
touch /media/sf_LinuxEducation/pre-start
sleep 15
touch /media/sf_LinuxEducation/pre-start-long
end script

post-start script
touch /media/sf_LinuxEducation/post-start
sleep 15
touch /media/sf_LinuxEducation/post-start-long
end script

pre-stop script
touch /media/sf_LinuxEducation/pre-stop
sleep 15
touch /media/sf_LinuxEducation/pre-stop-long
end script

post-stop script
touch /media/sf_LinuxEducation/post-stop
sleep 15
touch /media/sf_LinuxEducation/post-stop-long
end script

O resultado é que apenas um toque é realizado (o primeiro toque na pré-partida). O que preciso mudar para ver um dos retoques após o sono funcionar? Ou existe uma maneira mais fácil de conseguir isso?

Desde já, obrigado.

Tiris
fonte

Respostas:

7

A Introdução do iniciante, o Livro de receitas e as práticas recomendadas têm um grande número de trechos de código a serem usados ​​na criação de tarefas e trabalhos iniciados.

A seção do processo de desligamento do livro de receitas diz que /etc/init/rc.confserá executada e chamada /etc/init.d/rc. Por sua vez, isso acabará chamando /etc/init.d/sendsigs. Portanto, se você start on starting rc, sua tarefa será executada antes do rc (e os sigtermas que normalmente teriam o processo encerrado).

arquivo: /etc/init/test.conf

description "test script to run at shutdown"

start on starting rc
task
exec /etc/init/test.sh

arquivo: /etc/init/test.sh

touch /media/sf_LinuxEducation/start
sleep 15
touch /media/sf_LinuxEducation/start-long
aquafunk
fonte
1
Adicionamos um exemplo concreto a essa pergunta, mas ela não funciona (apenas o primeiro toque é executado no desligamento), mesmo que a documentação em Criar um alias de eventos diga que deveria. Por favor, olhe para ele e veja se eu cometi um erro.
Tiris
Tiris, isso deve funcionar. Eu estaria interessado em ver o seu / var / log / syslog após a reinicialização, principalmente para ver se o processo do teste foi forçado a matar pelo iniciante.
SpamapS
1
A edição mais recente desta resposta funciona. Verifique o histórico de revisões para ver o filho problemático. Acho que deveria ter comentado que fiz uma edição (ou é mais apropriado remover o comentário e adicionar um novo? Existe uma etiqueta de troca de pilhas?). Eu estaria interessado em saber por que o filho problemático não funciona (já que a documentação diz que deveria).
Tiris
O que exatamente o arquivo test.conf significa? Crio um arquivo chamado test.conf ou adiciono-o ao rc.conf?
Heneryville
@heneryville test.confé apenas um nome de arquivo aleatório. Você poderia usar com a mesma facilidade whatEverYouWant.conf. Seu comentário também mostra que você não leu o "Livro de receitas" mencionado na resposta. Se você consultar a seção 4.2, o arquivo de configuração do trabalho será explicado mais detalhadamente.
Tiris 02/03
7

Eu acho que isso não pode ser feito via upstart , pois o script /etc/init.d/sendsigs , que é invocado pelo upstart ao interromper / reiniciar, mata todos os processos ( killall5 -9) em 10 segundos e, mesmo que isso não seja bem-sucedido, continua para desmontar tudo e desligar.

A melhor maneira seria usar os scripts enferrujados no estilo /etc/init.d .

Exemplo: /etc/init.d/shutdown_job

#! /bin/sh
### BEGIN INIT INFO
# Provides:          shutdown_job
# Required-Start:    
# Required-Stop:     sendsigs
# Default-Start:
# Default-Stop:      0 6
# Short-Description: bla
# Description: 
### END INIT INFO

PATH=/sbin:/usr/sbin:/bin:/usr/bin

. /lib/lsb/init-functions

do_stop () {
    date > /root/s.log
    sleep 20
    date >> /root/s.log
}

case "$1" in
  start)
    # No-op
    ;;
  restart|reload|force-reload)
    echo "Error: argument '$1' not supported" >&2
    exit 3
    ;;
  stop)
    do_stop
    ;;
  *)
    echo "Usage: $0 start|stop" >&2
    exit 3
    ;;
esac

:

Em seguida, ative o script

sudo update-rc.d shutdown_job start 19 0 6 .

Isso colocará o script antes do script sendigs nos níveis de execução 0 a 6 (desligamento, reinicialização). Este script de exemplo registrará a data, depois dormirá por 20 segundos e registrará a data novamente em /root/s.log .)

Mais informações:

organizar
fonte
Não estou familiarizado com esse tipo de coisa. Existe um bom guia para fazer isso funcionar? Edite com mais informações.
Tiris
Eu tentei isso e não funciona (bem, não exatamente). Eu adicionei um touch /media/sf_LinuxEducation/starte touch /media/sf_LinuxEducation/start-longlogo ao lado dos comandos de data. As datas são registradas, mas os toques não são tocados. Isso me faz pensar se essa unidade está desmontada no momento em que o script é executado. Eu acho que pode ter algo a ver com o argumento NN, embora eu não tenha muita certeza de como esse argumento funciona (a página de manual explica isso de uma maneira muito distorcida). Como você sabe qual número (ou par de números) deve ser definido nesse argumento?
Tiris
Os scripts são executados conforme seus números, como visto quando você lista o /etc/rc6.ddiretório. Portanto, o script de desligamento 19 deveria ter sido executado antes de qualquer desmontagem (> 31). Mas por que não tentar sua hipótese e tocar em um arquivo /root?
organize
Olhar no dir /etc/rc6.drevela que as pastas compartilhadas estão sendo montadas / desmontadas com o K70vboxaddscript. Alterar o argumento NN (para o meu script) para 71 fazia com que meu script fosse executado antes da desmontagem de pastas compartilhadas do VB? Vou tentar mais tarde hoje.
Tiris
Bem, isso não funcionou. Atualização: eu adicionei um touch /root/startantes do sleep 20comando e nenhum arquivo é criado. Eu nem sei por onde começar a descobrir o porquê. As datas são adicionadas com alegria ao /root/s.logarquivo Por que não consigo tocar em um arquivo?
Tiris