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

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

Estou executando o Ubuntu 11.10 em uma máquina virtual (VirtualBox) para aprender mais sobre desenvolvimento em 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 estiver em execução.

Gostaria de executar este script automaticamente antes do desligamento, para que meu trabalho esteja sempre disponível se a VM estiver desligada (atualmente tenho que executar o script manualmente).

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 na pré-partida). O que preciso mudar para ver um dos toques depois de dormir para funcionar? Ou existe uma maneira mais fácil de conseguir isso?

Desde já, obrigado.

Responder1

OIntrodução, livro de receitas e práticas recomendadas do Upstarttem um grande número de trechos de código para usar na criação de tarefas e trabalhos iniciais.

Oprocesso de desligamentoseção do livro de receitas diz que /etc/init/rc.confserá executado e chamado /etc/init.d/rc. Por sua vez, isso eventualmente chamará /etc/init.d/sendsigs. Portanto, se você start on starting rcfizer isso, sua tarefa será executada antes do rc (e dos sigterms que normalmente encerrariam o processo).

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

Responder2

Acho que isso não pode ser feito atravéssubir na vida, Enquanto o/etc/init.d/sendsigsscript, que é invocado porsubir na vidaao parar/reiniciar, mata todos os processos ( killall5 -9) em 10 segundos, e mesmo que não dê certo, vai desmontar tudo e desligar.

A melhor maneira seria usar o enferrujado/etc/init.droteiros de estilo.

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

:

Então ative o script

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

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

Mais informações:

informação relacionada