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

Tir*_*ris 11 shutdown upstart

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

我想在关机前自动运行这个脚本,这样如果 vm 关闭,我的工作总是可用的(目前我必须手动运行脚本)。

我不知道 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
Run Code Online (Sandbox Code Playgroud)

结果是只完成了一次触摸(预启动中的第一次触摸)。我需要改变什么才能看到睡眠后的触摸工作?或者有没有更简单的方法来实现这一目标?

提前致谢。

aqu*_*unk 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
Run Code Online (Sandbox Code Playgroud)

文件:/etc/init/test.sh

touch /media/sf_LinuxEducation/start
sleep 15
touch /media/sf_LinuxEducation/start-long
Run Code Online (Sandbox Code Playgroud)


arr*_*nge 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

:
Run Code Online (Sandbox Code Playgroud)

然后激活脚本

sudo update-rc.d shutdown_job start 19 0 6 .
Run Code Online (Sandbox Code Playgroud)

这会将脚本放在运行级别 0 到 6(关机、重启)的sendigs脚本之前。此示例脚本将记录日期,然后休眠 20 秒,然后再次将日期记录到/root/s.log。)

更多信息: