Como configuro o upstart para executar um script no desligamento quando o processo demora 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 empacotar meu trabalho e salvá-lo na pasta compartilhada para uso enquanto a máquina virtual não estiver em execução.

Eu gostaria de executar automaticamente este script antes do desligamento para que meu trabalho esteja sempre disponível se o vm estiver desligado (atualmente eu tenho que executar manualmente o script).

Não sei se o upstart é 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 no pré-início). O que preciso mudar para ver um dos retoques após o sono funcionar? Ou existe uma maneira mais fácil de conseguir isso?

Obrigado antecipadamente.

    
por Tiris 11.11.2011 / 18:33

2 respostas

6

O Introdução, livro de receitas e práticas recomendadas do Upstart tem um grande número de trechos de código para usar na criação de tarefas e trabalhos iniciantes.

A seção processo de desligamento do livro de culinária diz que /etc/init/rc.conf será executado e chamará /etc/init.d/rc . Por sua vez, isso eventualmente chamará /etc/init.d/sendsigs . Então, se você start on starting rc , sua tarefa será executada antes de rc (e os sigterms 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
    
por overprescribed 11.11.2011 / 20:10
7

Acho que isso não pode ser feito via upstart , como o script /etc/init.d/sendsigs , que é invocado por upstart quando parar / reiniciar, mata todos os processos ( killall5 -9 ) dentro de 10 segundos, e mesmo que isso não seja bem sucedido, vai desmontar tudo e desligar.

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

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 .

Isto colocará o script antes do script sendigs nos runlevels 0 a 6 (shutdown, reboot). Este script de amostra registrará a data, depois suspenderá por 20 segundos e gravará a data novamente em /root/s.log .

Mais informações:

por arrange 12.11.2011 / 00:15