我有一个虚拟机需要启动、执行特定任务,然后自行关闭。
还需要能够中止特殊的启动序列以获得“常规”启动行为,即在应用程序运行之前或关闭之前。
我尝试使用以下内容来完成此任务/etc/rc.local
:
#!/bin/bash
trap "echo;echo Resuming regular system startup...;exit" SIGINT
echo "Press Ctrl+C within 10 seconds to skip application run..."
sleep 10
su ubuntu -c /home/ubuntu/application.py
echo "Press Ctrl+C within 30 seconds to abort shutdown..."
sleep 30
shutdown -h now
当我登录时以 root 身份直接执行 /etc/rc.local 时,它运行良好并且按预期工作,但当它实际作为系统启动的一部分运行时,它似乎不起作用。它运行良好,但它不会响应 Ctrl+C 实际上可中止。
SSH:在执行此脚本期间插入并发出 akillall -INT rc.local
似乎也不会停止脚本的执行,killall -9 rc.local
但确实会停止它,并将控制台放入login
.
该系统似乎使用 upstart 进行引导,如下所示:
root@fundie:~# ps 1
PID TTY STAT TIME COMMAND
1 ? Ss 0:01 /sbin/init
root@fundie:~# /sbin/init --version
init (upstart 1.12.1)
Copyright (C) 2006-2014 Canonical Ltd., 2011 Scott James Remnant
This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
我缺少什么?
答案1
我设法通过使用解决了这个问题普利茅斯,这是在启动和关闭 Ubuntu 系统时提供图形“启动”屏幕的应用程序。我能够使用它以迂回方式将 SIGINT 发送到 rc.local 脚本。
这有点像黑客,但这就是我最终所做的:
#!/bin/bash
plymouth watch-keystroke --command="kill -INT $$" --keys=' ' &
trap "echo;echo Resuming regular system startup...;exit" SIGINT
for i in `seq 10 -1 1`
do
echo -ne "\rPress spacebar within $i second(s) to skip application run... "
sleep 1
done
echo
su ubuntu -c /home/ubuntu/application.py
for i in `seq 30 -1 1`
do
echo -ne "\rPress spacebar within $i second(s) to abort shutdown... "
sleep 1
done
echo
shutdown -h now
这足以满足我的目的。