백그라운드 또는 부팅 스크립트의 로그 출력


10

특정 이벤트에 대한 시스템 데몬에 의해 실행되는 짧은 스크립트가 있습니다. 이벤트가 발생하고 스크립트가 실행되고 있음을 알고 있지만 의도 한대로 수행하지 않습니다. 이상하게도 수동으로 실행하면 매우 혼란스러워집니다.

무슨 일이 일어나고 있는지 어떻게 알 수 있습니까? 스크립트는 기본적으로 다음과 같은 일련의 명령입니다.

/bin/foo on 3
sudo bar a

나는 이것이 시스템 스크립트 디버깅에 대한 튜토리얼이라는 것을 이해하지만 조금도 이해 U&L합니다. 제목을 잘못 읽고 "디버깅을 위해 시스템 스크립트의 출력을 로그"하면 목적이 더 명확해질 것입니다. 또한이 foo bar예 들을 읽으면 뇌가 얼어 붙어 더 현실 세계를 선호합니다. 게시물을 편집하는 것을 꺼려하므로 개선 할 수 있다고 생각되면이 게시물을 남겨 두십시오.
Milliways

1
@Milliways 당신은 맞습니다. "시스템 스크립트"는 어쨌든 일종의 잘못된 이름이므로 제목을 변경했습니다. 나는 어리석은 것에 대해 동의하지 않는다. 사람들은 다른 문화에서와 마찬가지로 일반적인 링고 / 구어를 인식하는 법을 배워야한다. 또한 두 가지를 합치면 여전히 좋은 킥킥입니다.
goldilocks

답변:


8

먼저 스크립트가 시스템 데몬에 의해 실행되고 해당 데몬이 루트 권한으로 실행중인 경우을 사용할 필요가 없습니다 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

맨 위 (또는 어느 곳에서나 모든 후속 작업에 적용됨)


2

데몬으로 스크립트를 실행할 때 사람들이 잊어 버리는 중요한 측면 중 하나는 쉘 환경이며 $PATH특히 변수입니다. 귀하의 예에서 두 번째 줄은 $PATH전체 이름은 sudo입니다 /usr/bin/sudo. 그리고 사용자 셸 /usr/bin은 실행 파일 을 찾을 때 검색하라는 메시지를 받았기 때문에이를 알고 있습니다. 의 경우도 마찬가지입니다 bar.

sudo스크립트를 데몬으로 실행할 때 이것이 필요하지 않다는 것을 고려하면 두 번째 줄은 다음과 같아야합니다.

/path/to/bar a
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.