
Я запускаю Ubuntu 11.10 на виртуальной машине (VirtualBox), чтобы узнать больше о разработке в Linux. Я использую репозиторий git для сохранения своей работы и написал скрипт для объединения своей работы и сохранения ее в общей папке для использования, пока виртуальная машина не запущена.
Я хотел бы автоматически запускать этот скрипт перед выключением, чтобы моя работа всегда была доступна, если виртуальная машина выключена (сейчас мне приходится запускать скрипт вручную).
Я не знаю, является ли upstart лучшим способом сделать это, но вот конфигурация, которую я написал в качестве теста:
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
В результате выполняется только одно касание (первое касание в предстарте). Что мне нужно изменить, чтобы одно из касаний после сна сработало? Или есть более простой способ сделать это?
Заранее спасибо.
решение1
TheВведение в Upstart, кулинарная книга и лучшие практикисодержит большое количество фрагментов кода, которые можно использовать при создании задач и заданий upstart.
Theпроцесс выключенияраздел кулинарной книги говорит, что /etc/init/rc.conf
будет запущен и вызван /etc/init.d/rc
. В свою очередь это в конечном итоге вызовет /etc/init.d/sendsigs
. Так что если вы start on starting rc
тогда ваша задача будет выполнена до rc (и sigterms, которые обычно останавливают процесс).
файл: /etc/init/test.conf
description "test script to run at shutdown"
start on starting rc
task
exec /etc/init/test.sh
файл: /etc/init/test.sh
touch /media/sf_LinuxEducation/start
sleep 15
touch /media/sf_LinuxEducation/start-long
решение2
Я думаю, что это невозможно сделать черезвыскочка, как/etc/init.d/sendsigsскрипт, который вызываетсявыскочкапри остановке/перезапуске завершает все процессы ( killall5 -9
) в течение 10 секунд, и даже если это не удается, он выполняет размонтирование всего и завершение работы.
Лучшим способом было бы использовать ржавый/etc/init.dСценарии стилей.
Пример:/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
:
Затем активируйте скрипт.
sudo update-rc.d shutdown_job start 19 0 6 .
Это поместит скрипт передпосылает сигналыскрипт на уровнях запуска 0 и 6 (выключение, перезагрузка). Этот пример скрипта запишет дату, затем уснет на 20 секунд, затем снова запишет дату в/root/s.log.)
Больше информации: