
부팅하고 특정 작업을 수행한 다음 자체 종료해야 하는 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:ing을 실행하고 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
이것은 내 목적에 충분할 것입니다.