upstart - 仅在系统启动时执行特定命令,而不是在应用程序启动时执行

upstart - 仅在系统启动时执行特定命令,而不是在应用程序启动时执行

我是 upstart 的新手,我想知道是否有办法告诉 upstart 仅在系统启动时执行特定命令,而不是在随后从命令行重新启动应用程序时执行。例如,我有以下 upstart 配置:

#!upstart
description "Hello World"
author      "me"

start on (local-filesystems and net-device-up)
stop on shutdown

script
    export HOME="/root"
    echo $$ > /var/run/hello-world.pid
    exec /usr/local/bin/hello-world
end script

pre-start script
    # Date format same as (new Date()).toISOString() for consistency
    echo "[`date -u +%Y-%m-%dT%T.%3NZ`] Hello World Starting" >> /var/log/hello-world.sys.log
end script

pre-stop script
    rm /var/run/hello-world.pid
    echo "[`date -u +%Y-%m-%dT%T.%3NZ`] Hello World Stopping" >> /var/log/hello-world.sys.log
end script

这成功在启动时启动了应用程序。如果我执行:

/sbin/start hello-world

这将再次启动应用程序:我想仅在系统启动时执行特定命令,而不是在应用程序启动时执行,例如:

第一次执行:

  1. 系统启动
  2. Upstart 被执行
  3. 执行特定的系统启动脚本
  4. 应用程序 hello-world 被执行

第二次执行使用/sbin/start hello-world

  1. 仅执行应用程序而不执行特定的启动脚本

有办法吗?

答案1

我有一个解决方案,但是它太丑陋了。

因此../proc/uptime包含自启动以来的秒数。

$ cat /proc/uptime
  350735.47 234388.90

第一个数字是开启秒数,第二个数字是空闲秒数。

所以..

$UPTIME=$(cut -f1 -d' '< /proc/uptime)
if [ $UPTIME -le 300 ] then
  /start/pre-run/script.sh
fi

如果系统刚刚启动(或 300 秒内未运行),则将运行预运行脚本。您可以将 300 秒调低至系统准备就绪的实际时间。

虽然很脏,但值得一试,对吧?

答案2

使用下面的‘cookie 文件’ /var/run*。仅当 cookie 文件不存在时才执行特定的启动脚本,并在成功执行后创建它。

*)文件系统层次结构标准 2.3

Files under this directory must be cleared (removed or truncated as appropriate) at the beginning of the boot process.

相关内容