사용환경
Raspberry Pi 4 Compute Module + 7인치 GUI에서 진행
라즈베리파이에서 자동 실행시키기
GUI환경으로 부팅이 바로 되므로 LXDE의 autostart 기능을 이용해 애플리케이션을 자동 실행하였다.
autostart 파일 편집
sudo nano /etc/xdg/lxsession/LXDE-pi/autostart
위 2줄은 기본값이고 아래 3번째 줄에 실행파일을 등록해준다.
라즈베리파이를 재부팅하면 시작될 때 자동으로 프로그램도 실행된다.
GUI 프로그램 안정적인 종료 및 라즈베리파이 종료
프로그램 종료하기
onClicked: Qt.quit()
qml에서 간단하게 버튼의 onClicked에 Qt.quit()만 하면 프로그램이 꺼지게 된다.
하지만 리소스 정리(cleanUP)를 하고 끄거나 전원까지 끄기 위해서 C++에서 처리하였다.
안정적인 프로그램 종료 및 라즈베리파이 셧다운
1. Qml Button onClicked
onClicked: threadController.shutdownApplication()
2. threadController클래스의 shutdownApplication() 매서드
void ThreadController::shutdownApplication()
{
qDebug() << "[ThreadController] 애플리케이션 종료 cleanup 시작";
// Worker 스레드 정리
if(workerThread.isRunning()){
workerThread.quit();
workerThread.wait();
}
// QSettings에 저장된 값 동기화
QSettings settings("ModernControl", "ForTex7-DiF");
settings.sync();
qDebug() << "[ThreadController] cleanup 완료. 애플리케이션 종료 및 시스템 종료 실행";
// SystemController를 이용하여 라즈베리파이 종료
// SystemController 객체를 생성하여 shutdownSystem() 호출
SystemController sysCtrl;
sysCtrl.shutdownSystem();
// 애플리케이션도 종료
QCoreApplication::quit();
}
PLC와 통신하는 workerThread 정리 및 QSetting값 동기화를 해준다.
그리고 SystemController의 객체를 생성하여 shutdownSystem() 매서드를 호출해 라즈베리파이를 종료하고 애플리케이션도 종료한다.
3. SystemController클래스의 shutdownSystem() 매서드
void SystemController::shutdownSystem()
{
qDebug() << "[SystemController] 시스템 종료 명령 실행 시작";
QString program = "sudo";
QStringList arguments;
arguments << "/usr/sbin/shutdown" << "-h" << "now";
bool started = QProcess::startDetached(program, arguments);
if (!started) {
qWarning() << "[SystemController] 시스템 종료 명령 실행 실패";
}
}
이 매서드에서 처음에는 명령어를 한 줄로 아래와 같이 적어서 shutdown이 제대로 작동하지 않았다.
QProcess::startDetached("sudo /usr/sbin/shutdown -h now");
그 이유는 Qt의 QProcess::startDetached()는 인자로 전달된 단일 문자열을 쉘을 통해 해석하지 않고 그대로 실행 파일의 경로로 인식한다. 따라서 "sudo /usr/sbin/shutdown -h now" 전체를 실행 파일 이름으로 찾으려고 하기 때문에 실제로 존재하지 않는 실행 파일을 찾게 되어 프로세스 생성이 되지 않는다.
따라서 위와 같이 실행 파일과 인자들을 별도로 분리하여 전달하였다.
4. 라즈베리파이 세팅
일반적으로 Linux 시스템에서는 pi 사용자는 sudo 명령어를 사용할 수 있지만 sudo 명령은 비밀번호 입력을 요구한다. 따라서 애플리케이션 내에서 QProcess를 사용하여 "sudo shutdown -h now"를 실행할 경우 비밀번호 입력 프롬프트가 뜨지 않고 바로 실행되도록 하려면 sudoers 파일을 수정하여 해당 명령어에 대해 비밀번호 없이 실행할 수 있도록 설정해야 한다.
4-1. 터미널에서 아래의 명령어를 실행한다.
sudo visudo
4-2. shutdown 명령어 비밀번호 없이 실행 허용하기
visudo를 통해 들어온 파일에서 맨 아래로 내려가서 아래와 같이 명령어를 입력한다.
pi ALL=(ALL) NOPASSWD: usr/sbin/shutdown
※주의사항※
경로가 /usr/sbin/shutdown이 아닐 수도 있기 때문에 sudo which shutdown 명령어로 shutdown의 경로를 파악해서 넣어야 한다.