
У меня есть виртуальная машина, которая должна загрузиться, выполнить определенную задачу, а затем выключиться.
Также необходимо иметь возможность прерывать специальную последовательность запуска, чтобы получить «обычный» режим загрузки, т. е. либо перед запуском приложения, либо перед завершением работы.
Я попытался добиться этого, используя следующее /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 как root, войдя в систему, но, похоже, это не работает, когда это фактически запущено как часть запуска системы. Это работает нормально, но это не реагирует на 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
Этого будет достаточно для моих целей.