我在虚拟机 (VirtualBox) 中运行 ubuntu 11.10,以了解有关 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
这Upstart 简介、指南和最佳实践有大量的代码片段可用于创建 upstart 任务和作业。
这关机过程食谱的部分说/etc/init/rc.conf
将运行并调用/etc/init.d/rc
。反过来,这将最终调用/etc/init.d/sendsigs
。因此,如果您start on starting rc
那么您的任务将在 rc(以及通常会关闭进程的信号)之前执行。
文件:/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脚本,由暴发户当停止/重新启动时,会在10秒内终止所有进程(killall5 -9
),即使不成功,它也会卸载所有内容并关闭。
最好的办法是使用生锈的/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。
更多信息: