
루트가 아닌 사용자로 실행되는 nodejs 프로세스가 있지만(이렇게 해야 하는 이유가 있습니다) 라즈베리 파이 gpio 인터럽트에 대한 루트 액세스가 필요한 종속성이 있습니다. 그래서 해결책은 gpio
노드를 실행하기 위한 sudoers 항목이 있는 rpi 그룹을 갖는 것이었습니다. 그런 다음 서비스 단위 파일로 이 스크립트를 시작하면 제대로 작동합니다.
[Unit]
Description=switches16-mcp230xx-dSxJM-interrupt Device Starter Service
After=network-online.target
[Service]
Environment=UCI_ENV=pro
ExecStart=/usr/bin/sudo /usr/bin/node -r esm /opt/light/switches16-mcp230xx-dSxJM-interrupt/index.js
Restart=on-failure
WorkingDirectory=/opt/light/switches16-mcp230xx-dSxJM-interrupt
[Install]
WantedBy=default.target
재부팅(또는 재부팅 실패) 시 문제가 발생합니다. 프로세스를 종료해야 하지만 sudo로 시작되었으므로 당연히 sudo로도 종료해야 합니다.
Mar 12 19:43:12 switches systemd[1289]: switches16-mcp230xx-dSxJM-interrupt.service: Failed to kill main process 11222 (sudo), ignoring: Operation not permitted
Mar 12 19:43:12 switches systemd[1289]: switches16-mcp230xx-dSxJM-interrupt.service: Killing process 11223 (node) with signal SIGKILL.
Mar 12 19:43:12 switches systemd[1289]: switches16-mcp230xx-dSxJM-interrupt.service: Failed to kill control group /user.slice/user-1000.slice/[email protected]/switches16-mcp230xx-dSxJM-
따라서 유닛 파일이 루트가 아닌 사용자로 시작되었으므로 사용자로서 종료되므로 시작할 때 의도적으로 sudo를 사용하여 프로세스를 종료해야 한다고 가정합니다. 그래서 이것을 추가했습니다.
ExecReload=/usr/bin/sudo /bin/kill -HUP $MAINPID
하지만 같은 오류가 발생했습니다. 내 sudoers.d 파일이
%gpio ALL=NOPASSWD: /usr/bin/node
%gpio ALL=NOPASSWD: /bin/kill
여기에 뭔가 빠졌음에 틀림없지만 지적할 수는 없습니다.
이는 유닛 파일에 의해 생성된 프로세스이므로 다시 시작하기 전에 종료되어야 합니다.
root 11093 0.0 0.3 8468 2920 ? Ss 18:01 0:00 \_ /usr/bin/sudo /usr/bin/node -r esm /opt/light/switches16-mcp230xx-dSxJM-interrupt/index.js
root 11094 6.7 4.8 142820 45788 ? SLl 18:01 6:52 \_ /usr/bin/node -r esm /opt/light/switches16-mcp230xx-dSxJM-interrupt/index.js
어떤 제안이 있으십니까?
이 서비스를 루트로 실행할 수 없다는 점을 다시 한번 강조하겠습니다. 따라서 이는 분명히 쉬운 답변이므로 제안할 필요가 없습니다. 이 코드를 배포하고 루트 액세스 키 없이 SSH를 통해 실행하므로 비밀번호 없는 sudo를 사용하여 사용자로 실행하는 것이 유일한 옵션입니다. 내 코드에 특정 하드웨어(루트) 종속성이 없었다면 이 문제는 전혀 발생하지 않았을 것입니다.