나는 그것이 모든 시작에서 사용되기를 원합니다 /etc/rc.local
.
예를 들어 내 스크립트가 호출되고 startscript.sh
저장 위치 /home/debian
는 다음과 같습니다. 먼저 이름이 지정된 파일을 생성하려고 시도한 test.log
다음 다른 작업을 수행합니다.
그러나 시작 시 오류를 읽었습니다.touch: cannot touch ‘test.log’: Permission denied
rc.local
내 이해에 따르면 루트로 실행되면 실행되는 모든 항목도 루트로 실행되어야 하므로 test.log
어쨌든 생성되어야 합니다. 어떻게 이것이 가능합니까?
startscript.sh
:
#!/bin/sh
touch test.log
#... other stuff
rc.local
단편:
#!/bin/sh -e
#.. other stuff
sh /home/debian/startscript.sh
답변1
이 접근 방식에는 두 가지 문제가 있습니다. 하나는 루트에 의해 실행된다는 점입니다 . 따라서 생성된 모든 파일은 실행 rc.local
하지 않는 한 루트가 소유하게 됩니다 . chown
둘째, 이는 보안상의 취약점으로, 루트로 실행된 코드는 루트 권한이 없는 사용자에 의해 수정될 수 있습니다.
더 좋은 방법은 다음을 사용하는 것입니다.@재시작cron
권한이 없는 사용자를 위한 시간 지정자. 이미 가지고 있다면예약 된 일들파일을 편집하여 이 줄을 추가한 다음 crontab <yourcrontab>
명령을 실행합니다. 또는 crontab -e
명령을 사용하여 이 줄을 직접 입력하세요.
@reboot /home/debian/startscript.sh
sh
로 시작하므로 스크립트를 실행할 필요가 없습니다 #!/bin/sh
.
답변2
배포판에서 다음 을 사용하는 systemd
경우/etc/rc.local
너무 이른, 루트 파일 시스템이 여전히 읽기 전용이거나 다른 파일 시스템이 아직 마운트되지 않은 동안.
.service
실행 중인 systemd 파일이 rc.local
특정 순서 종속성으로 구성되지 않은 경우 systemd
가능한 한 빨리 실행됩니다.
systemctl cat rc-local.service
실행 중인 서비스의 전체 정의를 보려면 실행하세요 rc.local
. 모든 After=
라인에 주의를 기울이고 시스템 시작 프로세스에서 만족할 수 있는 가장 빠른 지점을 고려하십시오. After=
구성 요구 사항에 맞게 한두 줄을 추가하는 재정의 파일을 추가할 수 있습니다 .