
SailfishOS 앱의 GUI는 Qt로, 백그라운드 데몬은 Go로 만들고 둘을 D-Bus나 소켓으로 연결하는 방법을 설명한다. 공식 Store에 앱을 제출할 계획이라면 GUI 앱의 임의 D-Bus 호출이 Sailjail에서 제한된다는 점을 고려해야 한다.
데몬은 종료 신호를 받아 정리 작업을 시작하도록 만들 수 있다. 예제에서는 Go의 signal.NotifyContext()로 SIGTERM, SIGINT, SIGQUIT을 처리하고, godbus 라이브러리로 시스템 D-Bus에 연결해 ConnMan의 PropertyChanged 신호를 구독한다. GetProperties 호출로 처음 네트워크 상태를 읽은 뒤 State 속성이 바뀔 때마다 상태를 기록한다. 신호를 받을 때는 내용과 형식을 검사하고, 컨텍스트가 취소되면 연결과 구독을 정리한다.
빌드 예시는 다음과 같다.
GOOS=linux GOARCH=arm64 CGO_ENABLED=0 go build -o our-cool-daemon .
글에 제시된 실행 결과에서 개발자 컴퓨터에서는 ConnMan이 없어 속성 조회 오류가 발생했고, SailfishOS 휴대전화에서는 초기 상태와 Wi-Fi·모바일 데이터 전환에 따른 상태 변화가 로그에 나타났다.
데몬과 GUI 사이의 통신 방식은 D-Bus와 소켓 중에서 고를 수 있다. D-Bus는 객체와 메서드를 등록하는 방식이라 설정이 비교적 간단하다. 다만 공식 Store에 등록할 GUI 앱은 허용 목록에 없는 D-Bus 호출을 할 수 없다. 앱이 사용자 지정 데몬에 의존하는 것도 공식 Store에서 허용되지 않는다고 설명한다. 별도 배포 앱에서 Sailjail 권한을 직접 정의하는 방법도 제시한다.
소켓은 통신 규약을 직접 정해야 하지만 사용 방식에 더 많은 선택지가 있다. 예제는 사용자 설정 디렉터리에 유닉스 소켓을 만들고, 줄 단위 JSON 명령을 받아 현재 네트워크 상태를 응답한다. 소켓 경로에 이미 다른 데몬이 연결되어 있는지 확인하고, 비정상 종료로 남은 소켓 파일은 제거한다. 종료 시에는 클라이언트 연결과 리스너를 닫고 고루틴이 끝날 때까지 기다린다. 글은 이 동기화 예제에도 드물게 드러나는 스레드 안전성 문제가 있을 수 있으며, Go의 동시성 프로그래밍을 다루는 글은 아니라고 한정한다.
패키징은 Go 바이너리를 호스트에서 교차 컴파일한 뒤 Sailfish SDK의 sfdk로 RPM을 만드는 방식이다. 64비트 빌드 외에 32비트 ARM용 명령도 소개하고, 자동 실행을 위해 systemd 사용자 유닛과 설치·삭제 스크립트를 RPM 사양에 추가하는 예를 든다.
GUI 예제는 네트워크 상태 라벨과 새로고침 메뉴를 갖춘 QML 앱이다. D-Bus를 쓰면 QML의 Nemo.DBus 모듈로 데몬의 메서드를 호출할 수 있다. 소켓을 쓰려면 Qt에서 연결·요청·응답을 처리하는 사용자 지정 C++ 핸들러를 작성해야 한다. 다음 글에서는 Go 비즈니스 로직을 공유 라이브러리로 빌드해 C++에서 직접 호출하는 방법을 다룰 예정이라고 밝혔다.
부록: 원문 예시
2026/10/16 20:58:21 INFO Starting daemon 2026/10/16 20:58:21 INFO initial network state state=online 2026/10/16 20:58:21 INFO monitoring network activity... 2026/10/16 20:58:27 INFO network state changed state=ready 2026/10/16 20:58:28 INFO network state changed state=idle 2026/10/16 20:58:28 INFO network state changed state=ready 2026/10/16 20:58:28 INFO network state changed state=online 2026/10/16 20:58:30 INFO network state changed state=ready 2026/10/16 20:58:30 INFO network state changed state=idle 2026/10/16 20:58:32 INFO network state changed state=ready 2026/10/16 20:58:32 INFO network state changed state=online 2026/10/16 20:58:38 INFO network state changed state=ready 2026/10/16 20:58:38 INFO network state changed state=online
[Unit] Description=Our Cool Daemon After=user-session.target After=dbus.socket Requires=dbus.socket [Service] ExecStart=/usr/bin/our-cool-daemon Restart=on-failure RestartSec=5 [Install] WantedBy=post-user-session.target
[X-Sailjail] # Simply add MyCoolDaemon to the list of permissions Permissions=MyCoolDaemon;Internet OrganizationName=dev.chrastecky ApplicationName=MyCoolApp
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요