起動し、特定のタスクを実行し、それ自体で終了する必要がある仮想マシンがあります。
また、「通常の」起動動作(アプリケーションの実行前または終了前など)を取得するために、特別な起動シーケンスを中断する必要があります。
私はこれを使ってこれをやろうとしています/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:このスクリプトの実行中にaを挿入して実行しても、killall -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
これは私の目的には十分です。