직렬 연결에서 데이터를 읽기 위해 간단한 .sh를 시작하는 시스템 서비스를 만들었습니다. 부팅 후 수동으로 서비스를 실행하면 제대로 작동하지만 부팅 시 자동으로 실행하려고 하면 awk: fatal: cannot open file /dev/ttyUSB0' for reading (No such file or directory
ttyUSB0()에서 .sh를 아직 읽을 수 없기 때문에 실패합니다.
서비스가 ttyUSB0을 기다린 다음 .sh를 실행하도록 하는 방법이 있습니까? after=ttyUSB0과 같은 것을 시도했지만 작동하지 않았습니다.
[Unit]
Description=Serial logger
[Service]
ExecStart=/serial_script.sh
[Install]
WantedBy=default.target
답변1
스크립트를 실행하려면 서비스 . 괜찮습니다. udev에서 장기 실행 프로세스를 시작하는 것은 권장되지 않으며 최신 udev 버전에서는 udev 트랜잭션 및 이에 의해 생성된 프로세스에 엄격한 시간 제한을 설정하여 이를 방지하려고 적극적으로 시도할 수 있기 때문입니다.udev
대신 규칙을 사용하는 것이 좋습니다systemd
systemd
그러나 udev에서 이 작업을 수행해야 하는 경우(예: 이전 버전이 포함된 이전 시스템에서) 다음과 같은 방법을 사용할 수 있습니다 ./etc/udev/rules.d/99-serial-logger.rules
SUBSYSTEM=="tty", ACTION=="add", KERNEL=="ttyUSB0", RUN+="/serial_script.sh"
이것을 시스템 서비스로 구현할 때(현재 권장되는 방식) WantedBy=default.target
서비스에서 이 줄을 제거하고 udev
다음 규칙을 만드세요.
SUBSYSTEM=="tty", KERNEL=="ttyUSB0", TAG+="systemd", ENV{SYSTEMD_WANTS}+="your-serial-logger.service"
따라서 장치가 나타날 때 서비스를 시작하고 장치가 제거되면 서비스를 중지하도록 udev
지시해야 합니다 .systemd
답변2
UDEV의 이러한 규칙은 작동하지 않습니다.
SUBSYSTEM=="tty", ACTION=="add", KERNEL=="ttyUSB0", RUN+="/serial_script.sh"
serial_script.sh | at now
udev 프로세스와 별도로 작업을 실행하는 데 사용됩니다 . UDEV는 RUN 또는 PROGRAM 스크립트에서 수명이 긴 백그라운드 프로세스를 시작하지 못하게 합니다. 그러나 이를 수행하는 "올바른 방법"은 systemd를 사용하는 것입니다. 나는 독서를 추천한다systemd를 사용하여 서비스 인스턴스화그리고udev 이벤트에서 장기 실행 systemd 서비스를 시작하는 올바른 방법그리고udev에서 장치의 systemd 서비스 인스턴스를 시작합니다.