Node-RED에서 ConnMan을 다시 시작하고 싶습니다. 서비스는 자체 사용자에 의해 실행됩니다 nodered
.
사용자로 장치에 SSH를 입력 nodered
하고 입력하면
nodered@pi:~$ sudo /etc/init.d/connman restart
이것은 작동합니다.
그러나 전화를 걸어 visudo
다음 줄을 추가하면 다음과 같습니다.
nodered ALL = (root) NOPASSWD: /etc/init.d/connman restart
명령을 실행할 때 다음 오류가 발생합니다.
nodered@pi:~$ /etc/init.d/connman restart
Restarting Connection Manager
/etc/init.d/connman: line 47: kill: (28874) - Operation not permitted
실패한 줄은 다음 /etc/init.d/connman
과 같습니다.
do_stop() {
# kill the script monitoring execution
if [ "X${pid=$(pidof -x /usr/sbin/connmand-watch.sh)}" != "X" ]; then
kill $pid
답변1
서비스와 해당 감시자가 모두 사용자로 실행 중이고 nodered
동일한 사용자로 로그인한 경우에는 sudo
전혀 그럴 필요가 없습니다. 프로세스 소유자는 kill -9
필요한 경우에도 항상 해당 프로세스를 종료할 권리가 있습니다.
이 sudoers
줄은:
nodered ALL = (root) NOPASSWD: /etc/init.d/connman restart
nodered
사용자에게 루트로 명령을 실행할 수 있는 권한을 부여합니다 /etc/init.d/connman restart
. 스크립트 또는 서비스 자체에서 서비스와 감시자가 모두 사용자로 시작되는지 확인하지 못하는 경우 nodered
스크립트를 실행하면 서비스 및/또는 스크립트가 루트 소유 프로세스로 다시 시작되는 sudo
의도하지 않은 부작용이 발생할 수 있습니다 . connmand-watch.sh
조심하세요.
를 사용하면 kill -0
실제로 신호를 보내지 않고도 프로세스가 종료될 수 있는지 여부를 테스트할 수 있습니다. 스크립트 시작 부분에서 다음과 같은 작업을 수행할 수 있습니다 /etc/init.d/connman
.
if [ $(whoami) != "root" ]; then
watcherpid=$(pidof -x /usr/sbin/connmand-watch.sh)
if [ "" != "$watcherpid" ] && ! kill -0 "$watcherpid" 2>/dev/null; then
# Watcher exists but cannot be signaled so it runs as some other user.
# Attempt to re-execute this script with root powers.
exec sudo /etc/init.d/connman "$@"
# If we reach this line, we could not exec sudo. That's bad.
exit 1
fi
fi
을 사용하면 exec sudo /etc/init.d/connman "$@"
스크립트가 sudo를 통해 다시 실행됩니다. 이후 exec
, 스크립트의 권한 없는 일반 복사본 실행은 즉시 종료되며 sudo
ed 버전은 이를 원래 호출과 동일한 명령줄 인수로 대체합니다.
감시자 프로세스를 찾을 수 없거나 스크립트가 이미 루트로 실행 중인 경우 이 테스트는 실패하며 조치가 필요하지 않습니다.
참고: 스크립트가 자체적으로 다시 실행을 시도 sudo
하고 시도가 실패하면 스크립트는 어떤 작업도 수행하지 않고 중지됩니다.