sudo
다음 줄 중 하나를 실행한 후에도 계속 실행되는 것으로 나타났습니다 . sudo
더 이상 계속 실행되지 않도록 데몬을 완전히 분리하는 방법이 있습니까 ?
sudo -u user daemon &
sudo -u user -b daemon
답변1
다음과 같이 한 번에 배경으로 설정할 수 있습니다.
sudo -u user sh -c "daemon & disown %1"
보기에는 Running 이 ps
표시됩니다 . 그것과 관련된 것은 아무것도 없을 것입니다 .daemon
user
sudo
답변2
sudo
요청한 프로그램을 실행한 후에는 더 이상 실행 상태를 유지하지 않습니다. 실제로 exec()
시스템 호출을 사용하여 프로그램이 동일한 PID를 갖도록 지정한 프로그램으로 대체합니다 sudo
. 다음 명령을 실행하여 이를 확인할 수 있습니다.
sudo -u user -b sleep 60
ps aux | grep sudo
ps aux | grep sleep
sleep은 여전히 실행 중이지만 sudo는 실행되지 않는 것을 볼 수 있습니다.
&
연산자를 사용하여 sudo를 백그라운드에 배치하도록 쉘에 요청하면 sudo는 비밀번호를 묻는 메시지를 표시해야 하는 경우 백그라운드에서 차단하고 무기한 대기합니다. 암호를 묻는 메시지가 표시되지 않으면 지정한 프로그램이 실행되고 sudo
다시 실행되지 않습니다. -b 스위치는 차단 가능성 때문에 선호되는 방법 sudo
이므로 필요한 경우 비밀번호를 묻는 메시지를 표시한 다음 요청된 프로그램을 실행하기 위해 백그라운드로 분기됩니다.
답변3
죄송합니다. 이것은 실제로 답변이 아니며 추가 의견에 가깝습니다.
psusi의 응답에도 불구하고 일부 버전은 항상 그럴 것 같습니다 sudo
(지정되지 않은 경우 fork()
하위 프로세스를 기다립니다).-b
using의 문제 는 데몬의 PID를 포함하지 않는다는 -b
것입니다 . using의 문제 는 args를 to에 전달하는 것이 상당히 뒤틀려 있다는 것입니다. Twist는 우선 sudo를 사용하는 주된 이유입니다.$!
daemonize
sudo sh -c 'run_my_daemon arg1 arg2 arg3... & save_pid $!'
run_my_daemon
처음부터 루트가 아닌 경우 비밀번호를 기다리는 것에 대해서만 걱정하면 됩니다. 특히 sudo -u $run_as_uid prog "${args[@]}"
이미 루트로 실행 중인 스크립트 내에서 비밀번호를 사용하는 것을 고려하세요.
답변4
프로그램이 있으시면 daemonize
사용하시면 됩니다 sudo daemonize PATH_TO_DAEMON
.