특정 이벤트에 대한 시스템 데몬에 의해 실행되는 짧은 스크립트가 있습니다. 이벤트가 발생하고 스크립트가 실행되고 있음을 알고 있지만 의도 한대로 수행하지 않습니다. 이상하게도 수동으로 실행하면 매우 혼란스러워집니다.
무슨 일이 일어나고 있는지 어떻게 알 수 있습니까? 스크립트는 기본적으로 다음과 같은 일련의 명령입니다.
/bin/foo on 3
sudo bar a
특정 이벤트에 대한 시스템 데몬에 의해 실행되는 짧은 스크립트가 있습니다. 이벤트가 발생하고 스크립트가 실행되고 있음을 알고 있지만 의도 한대로 수행하지 않습니다. 이상하게도 수동으로 실행하면 매우 혼란스러워집니다.
무슨 일이 일어나고 있는지 어떻게 알 수 있습니까? 스크립트는 기본적으로 다음과 같은 일련의 명령입니다.
/bin/foo on 3
sudo bar a
답변:
먼저 스크립트가 시스템 데몬에 의해 실행되고 해당 데몬이 루트 권한으로 실행중인 경우을 사용할 필요가 없습니다 sudo
. 여기에는 init
(및 systemd
) 이 포함 됩니다 rc.local
. 이 데몬이되면 되지 루트 권한으로 실행, 다음 sudo
하지 않는 한 작동하지 않습니다 /etc/sudoers
같은 (그리고 암호없이)를 허용하도록 구성되어있다. Raspbian 사용자는 pi
기본적으로 사용자가 무엇이든 할 수 있기 때문에 혼란 스러울 수 있습니다 /etc/sudoers
.
다음 bash
과 같이 서브 쉘에서 실행하여 스크립트 또는 bash 스크립트 내의 명령 세트 에서 출력을 캡처 할 수 있습니다 . 1
(
/bin/foo on 3
sudo bar a
) &> /var/log/myTestLog.txt
가 ()
나타내는 서브 쉘을 . 이 안에있는 모든 것의 모든 출력이 /var/log/myTestLog.txt
파일 로 리디렉션 됩니다. 몇 가지 참고 사항 :
&>
A는 bashism은 , 그래서 스크립트는 통해 실행되는 경우 오두막 첫 번째 줄에, 그것은해야 #!/bin/bash
하지 그냥 /bin/sh
. "Bashisms"는 bash
쉘 에서만 작동합니다 .
여기에는 /etc/rc.local
기본적으로 사용 /bin/sh
되는가 포함됩니다 (예 : 안전하게로 변경할 수 있음 /bin/bash
).
/var/log
쓰기 위해서는 루트 권한이 필요합니다. 프로세스에 그러한 디렉토리가없는 경우 가능한 디렉토리를 사용하거나 작성하십시오. 확실하지 않은 경우 시스템을 종료하거나 재부팅하지 않고이 테스트를 수행 할 수있는 경우 /tmp
세계적으로 쓸 수있는 (예 : 누구나) 사용할 수 있습니다. 그러나 /tmp
부츠 전체에서 지속되지는 않습니다. 또한 RAM 기반의 작은 파티션이므로 데이터를 기록하지 마십시오. 그것은 실제로 당신의 SD 카드가 아닙니다 (실제로 현재 Raspbian 버전에서는 있지만 실제로는 이것에 의존하지 않습니다) .
&>
의 모든 항목을 덮어 씁니다 myTestLog.txt
. 대신 디버깅 목적으로 좋은 기존 로그를 추가하려면을 사용하십시오 &>>
. 그런 다음 다음과 같이 해당 서브 쉘의 시작 부분에 명령을 추가 할 수 있습니다.
echo Starting $(date)
각 실행에서 정보를 분리합니다. 이것이 무엇인지 확실하지 않으면 명령 행에서 시도하십시오.
이 마지막 요점은 아무것도 출력하지 않는 명령과 관련하여 수행 할 수있는 작업을 잘 보여줍니다. 그러나 대부분 -v
" 예를 들어 "자세한 내용 을 포함하는 경우에는 명령이 포함됩니다 . 일부 명령 -v
은 "버전 정보 인쇄"를 의미합니다. 에서 찾아 보게 man 페이지를 경우 명령을 확인하고이 (어떤 명령도 아닌 다른 스위치를 사용하여 작업하는 방법에 대한 -v
).
일반적으로 명령은 완료되면 값 0을 리턴합니다. 이것을 "종료 상태"라고도하며 일반적으로 표시되지 않지만 셸에가 표시됩니다 echo $?
. 시험
ls /
echo $?
ls /nonexistantdir
echo $?
0과 2가 표시됩니다. 맨 페이지 ls
에서 "종료 상태"아래 를 보면 다소 구체적이지 않은 암호가 표시됩니다.
2 if serious trouble (e.g., cannot access command-line argument).
아무것도 아닌 것보다 낫거나 그렇지 않을 수도 있지만 거기에 있습니다.
최소한 이것은 어떤 이유로 명령이 실패했음을 나타냅니다. 종료 상태를 통해 다음과 같은 작업을 수행 할 수도 있습니다.
/bin/foo && sudo bar
&&
"첫 번째 명령이 성공하면"이 경우 수단으로는, 첫 번째 명령을 추정하는 것은 (그들이 일반적으로 할 이유입니다) 0을 반환하는 규칙을 사용합니다. 경우 /bin/foo
작동하지 않습니다 찾을 수없는 등, 다음 sudo bar
일은 없을 것입니다.
로깅 메시지와 조건부 실행 ( &&
)을 함께 사용하면 문제를 파악하거나 다른 사람들이 문제를 해결하는 데 도움이 될 수있는 정보를 얻는 데 훨씬 더 가까이 다가 갈 수 있습니다. 그것 없이는 다른 사람들이 할 수있는 가장 많은 것이 추측입니다.
1. 다음을 사용하여 내부에서 전체 스크립트에 대해 동일한 출력 리디렉션을 수행 할 수 있습니다.
exec &> /var/log/myTestLog.txt
맨 위 (또는 어느 곳에서나 모든 후속 작업에 적용됨)
데몬으로 스크립트를 실행할 때 사람들이 잊어 버리는 중요한 측면 중 하나는 쉘 환경이며 $PATH
특히 변수입니다. 귀하의 예에서 두 번째 줄은 $PATH
전체 이름은 sudo
입니다 /usr/bin/sudo
. 그리고 사용자 셸 /usr/bin
은 실행 파일 을 찾을 때 검색하라는 메시지를 받았기 때문에이를 알고 있습니다. 의 경우도 마찬가지입니다 bar
.
sudo
스크립트를 데몬으로 실행할 때 이것이 필요하지 않다는 것을 고려하면 두 번째 줄은 다음과 같아야합니다.
/path/to/bar a
U&L
합니다. 제목을 잘못 읽고 "디버깅을 위해 시스템 스크립트의 출력을 로그"하면 목적이 더 명확해질 것입니다. 또한이foo
bar
예 들을 읽으면 뇌가 얼어 붙어 더 현실 세계를 선호합니다. 게시물을 편집하는 것을 꺼려하므로 개선 할 수 있다고 생각되면이 게시물을 남겨 두십시오.