当进程耗时超过10秒时,如何配置upstart在关机时运行脚本?


11

我正在虚拟机(VirtualBox)中运行ubuntu 11.10,以了解有关Linux开发的更多信息。我正在使用git存储库来保存我的工作,并编写了一个脚本来捆绑我的工作并将其保存到共享文件夹中,以便在虚拟机未运行时使用。

我想在关机前自动运行此脚本,以便在关闭虚拟机时始终可以使用我的工作(当前,我必须手动运行该脚本)。

我不知道新贵是否是实现此目标的最佳方法,但这是我作为测试编写的配置:

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

结果是仅完成一次触摸(预启动中的第一次触摸)。睡觉后我需要改变什么才能看到其中一种感动?还是有更简单的方法来实现这一目标?

提前致谢。

Answers:


7

新贵入门》,《食谱》和《最佳实践》提供了大量用于创建新贵任务和工作的代码段。

本食谱的关闭过程部分说,/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

1
在此问题上添加了一个具体示例,但即使“ 创建事件别名 ”中的文档说应该这样做,它也不起作用(仅在关机时才进行第一次触摸)。请查看它,看看我是否出错。
提里斯(Tiris)

提里斯,这应该工作。我想在重新启动后查看您的/ var / log / syslog,特别是查看测试的过程是否被暴发户强行杀死了。
SpamapS 2011年

1
此答案的最新编辑确实有效。检查修订历史记录以查看有问题的孩子。我想我应该对我进行的编辑发表评论(或者删除评论并添加新评论更合适?是否有stackexchange礼节?)。我想知道为什么这个问题孩子不起作用(因为文档说应该如此)。
提里斯(Tiris)

test.conf文件到底是什么意思?我要创建一个名为test.conf的文件,还是将其添加到rc.conf中?
heneryville

@heneryville test.conf只是一个随机文件名。您可以轻松地使用whatEverYouWant.conf。您的评论还表明您没有阅读答案中提到的“菜谱”。如果您查看第4.2节,则会更全面地说明作业配置文件。
提里斯(Tiris)

7

我认为这无法通过upstart来完成,因为/etc/init.d/sendsigs脚本(在暂停/重新启动时由upstart调用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(关闭,重新引导)上的sendsigs脚本之前。此示例脚本将记录日期,然后睡眠20秒,然后再次将日期记录到/root/s.log。)

更多信息:


我完全不熟悉这种事情。有一个很好的指导使它起作用吗?请编辑更多信息。
提里斯(Tiris)

我尝试了一下,但不起作用(完全不正确)。我在日期命令旁边添加了touch /media/sf_LinuxEducation/starttouch /media/sf_LinuxEducation/start-long。记录日期,但未触碰。这使我想知道在运行脚本时是否已卸载该驱动器。我认为这可能与NN参数有关,尽管我不确定该参数的工作原理(手册页以一种极度弯曲的方式对其进行了解释)。您如何知道应在此参数中设置哪个数字(或一对数字)?
提里斯(Tiris)

脚本按照列出/etc/rc6.d目录时看到的编号执行。因此,在完成任何卸载(> 31)之前,应该已经执行了19个关闭脚本。但是,为什么不尝试您的假设并修改文件/root呢?
安排

在目录中查看会/etc/rc6.d发现共享文件夹正在使用K70vboxadd脚本进行装载/卸载。将NN参数(用于我的脚本)更改为71可以使我的脚本在卸载VB共享文件夹之前运行吗?我将在今天晚些时候尝试。
提里斯(Tiris)

好吧,那没有用。更新:touch /root/startsleep 20命令之前添加了一个,并且没有创建文件。我什至不知道从哪里开始找出原因。将日期愉快地添加到/root/s.log文件中,为什么我不能触摸文件?
提里斯(Tiris)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.