Ubuntu 14.04 の起動時に中止可能なタスク

Ubuntu 14.04 の起動時に中止可能なタスク

起動して特定のタスクを実行し、その後シャットダウンする必要がある VM があります。

また、アプリケーションの実行前またはシャットダウン前に、特別な起動シーケンスを中止して「通常の」起動動作を実行することも可能である必要があります。

私は以下を使用してこれを実現しようとしました/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

これは、ログイン時にルートとして /etc/rc.local として直接実行すると正常に動作し、期待どおりに機能しますが、システム起動の一部として実際に実行されると機能しないようです。正常に動作しますが、Ctrl + C に応答せず、実際に中止できません。

このスクリプトの実行中に SSH でログインして を発行しても、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

これは私の目的には十分でしょう。

関連情報