“pid 파일을 만들지 못했습니다… 권한이 거부되었습니다”라는 오류가 발생하는 이유는 무엇입니까? chown으로 어떻게 설정해야합니까? 특히,이 오류를 해결하기

프로그램에 쓰기 권한이 필요한 경우 chown으로 어떻게 설정해야합니까? 특히,이 오류를 해결하기 위해 foo의 권한을 프로그래밍하는 것은 무엇입니까?

failed to create pid file '/var/run/bar.pid': Permission denied


답변

foo파일을 만들거나 쓰려고 하는 프로그램이 있다면 foo바이너리 의 권한은 중요하지 않지만 실행중인 사용자 는 모든 차이 만듭니다.

이 경우 foo에 작성하려고 /var/run에 의해 소유되는, root그리고 에만 쓰기 권한을 루트 .

따라서 sudo fooPID 파일을 만들려면 프로그램을 실행해야 합니다. 프로그램을 실행하기 전에 루트로 프로그램을 실행할 수 있다는 보안상의 의미를 고려하십시오.


답변

일반적인 접근 방식 : 파일에 액세스하려는 프로세스의 사용자 및 그룹을 결정하십시오. 이것은 종종 소프트웨어 구성 (예 : webservers / mailservers / …)에서 찾을 수 있지만 소프트웨어가 이미 실행중인 경우 다음을 사용하십시오.

ps aux

액세스 권한을 구성하려는 프로세스를 찾으십시오. 첫 번째 열에는 실행중인 사용자 이름이 표시됩니다.

groups <username>

사용자가 속한 그룹을 알려줍니다.

서비스와 일치하도록 파일의 소유자 또는 그룹을 변경하십시오.

참고 1 : 질문이 파일이 / var / run /에 있다고 지적한 것처럼 하나의 프로세스에만 액세스가 필요하다고 가정하고 있습니다. 그렇지 않은 경우 소유자 또는 그룹을 변경해서는 안되지만 프로세스 추가를 고려할 수 있습니다 ‘를 사용하여이 파일 / 폴더에 대한 새 그룹을 작성하십시오.

참고 2 : 보안 시스템 인 apparmor를 사용하면 재미있는 일이 발생할 수 있습니다. 프로세스가 파일 시스템 수준에서 필요한 모든 권한을 가진 파일과 폴더에 프로세스를 쓰지 못하게 할 수 있습니다. 함께 aa-status하면 당신의 서비스에 대한 특정 규칙이 활성 상태인지 여부를 확인할 수 있습니다.


답변

내가 한 것은 start-stop-deamon이 실행되기 직전에 폴더 생성을 추가하는 것입니다. 스크립트는 일반적으로 시작하는 동안 루트로 실행되기 때문에 작동합니다. 단지 / var / run에 폴더를 만들고 소유자를 즉시 ​​변경하므로 PID를 작성할 수 있습니다.

아래 예에서는 PID를 현재 실행 사용자로 설정 한 / var / run의 하위 폴더가 있는지 확인합니다.이 경우 사용자 ‘pi'(라즈베리에 있으므로).

이 링크는 나에게 매우 교육 적이기 때문에 확인하십시오 : Python 스크립트는 서비스로 실행 되지만 여기서 논의 된 문제는 다루지 않았습니다.

쉘 스크립트의 예제 부분 :

# The process ID of the script when it runs is stored here:
PIDFILE=/var/run/power/$DAEMON_NAME.pid

do_start () {
    log_daemon_msg "Starting system $DAEMON_NAME daemon"
    if [ ! -d /var/run/power ]; then
        mkdir /var/run/power/
        chown pi:pi /var/run/power/
    fi
    start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --user $DAEMON_USER --chdir $DIR --startas $DAEMON -- $DAEMON_OPTS
    log_end_msg $?
}