직렬 포트를 통해 Arduino와 통신하는 작업 관리자가 있고 Arduino에는 시스템의 CPU, 메모리, 스왑, 네트워크 다운로드/업로드, 디스크 읽기/쓰기 사용량을 보여주는 OLED 디스플레이가 있습니다.
서비스는 Ruby로 작성되었으며 절대 종료되지 않습니다. Arduino를 분리했다가 다시 연결하면 서비스가 이를 감지합니다.
시작 시 Ruby 스크립트를 활성화하려면 다음과 같은 systemd 서비스가 있습니다.
[Unit]
Description=Arduino OLED as a Ultra Light-Weight System Monitor
[Service]
ExecStart=/bin/ruby /root/.local/share/gem/ruby/3.0.0/bin/blink-tm
Restart=on-failure
User=root
Group=root
[Install]
WantedBy=multi-user.target
시작하면 잘 작동합니다. 하지만 Arduino의 플러그를 뽑으면 코드가 작동해야 함에도 불구하고 장치가 여전히 비활성화됩니다! Type=oneshot
, Type=simple
, 및 추가도 시도했지만 Type=forking
운이 없었습니다.
Arduino가 PC에서 분리되었을 때의 서비스 상태는 다음과 같습니다.
○ blink-tm.service - Arduino OLED as a Ultra Light-Weight System Monitor
Loaded: loaded (/usr/lib/systemd/system/blink-tm.service; enabled; vendor preset: disabled)
Active: inactive (dead) since Wed 2021-07-14 13:02:33 IST; 3min 30s ago
Process: 3502 ExecStart=/bin/ruby /root/.local/share/gem/ruby/3.0.0/bin/blink-tm (code=exited, statu>
Main PID: 3502 (code=exited, status=0/SUCCESS)
CPU: 115ms
Jul 14 13:02:33 archlinux ruby[3502]: :: 13:02:32.41: A potential device discovered: 1a86:7523
Jul 14 13:02:33 archlinux ruby[3502]: :: 13:02:32.41: Changing baudrate to 57600...
Jul 14 13:02:33 archlinux ruby[3502]: :: 13:02:32.41: Successfully Changed baudrate to 57600...
Jul 14 13:02:33 archlinux ruby[3502]: :: 13:02:32.41: No device found. Retrying 2
Jul 14 13:02:33 archlinux ruby[3502]: :: 13:02:32.91: A potential device discovered: 1a86:7523
Jul 14 13:02:33 archlinux ruby[3502]: :: 13:02:32.91: Changing baudrate to 57600...
Jul 14 13:02:33 archlinux ruby[3502]: :: 13:02:32.91: Successfully Changed baudrate to 57600...
Jul 14 13:02:33 archlinux ruby[3502]: :: 13:02:33.41: Device discovered successfully. Path: /dev/ttyUSB0
Jul 14 13:02:33 archlinux ruby[3502]: :: 13:02:33.66: Device ready!
Jul 14 13:02:33 archlinux systemd[1]: blink-tm.service: Deactivated successfully.
앞에서 언급했듯이 Ruby 스크립트는 결코 실패하지 않으며 표준 출력으로 무언가를 인쇄합니다. 한 가지 예는 /bin/ruby /root/.local/share/gem/ruby/3.0.0/bin/blink-tm
Arduino를 분리했다가 다시 연결하면 터미널에서 실행이 종료되지 않는다는 것입니다.
그렇다면 자동 서비스 비활성화의 이유는 무엇일까요? Ruby 스크립트가 실행될 때마다 서비스를 실행하고 싶습니다.
답변1
터미널에서 프로그램을 실행할 때 현재 tty가 제어 터미널이므로 새 tty를 열어도 이것이 변경되지 않습니다. systemd에서 실행하는 경우 제어 터미널이 없으므로 open(2)
직렬 포트에 있으면 제어 터미널이 됩니다. 프로세스가 터미널 제어를 잃으면 SIGHUP을 받습니다. O_NOCTTY
이를 방지하려면 플래그를 추가해야 합니다 . man open
로고 정보는 다음과 같습니다.
O_NOCTTY. 경로명이 터미널 장치를 참조하는 경우(tty(4) 참조) 프로세스에 제어 터미널이 없더라도 해당 경로는 프로세스의 제어 터미널이 되지 않습니다.