
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.conf
será executado e chamado /etc/init.d/rc
. Por sua vez, isso eventualmente chamará /etc/init.d/sendsigs
. Portanto, se você start on starting rc
fizer 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: