추가 읽기

추가 읽기

GPIO에 연결된 스위치 및 센서와 TTY 직렬을 통해 연결된 Arduino에서 입력을 받는 Raspberry-Pi 기반 장치가 있습니다. 이 모든 것을 관리하는 주요 애플리케이션은 Python3으로 작성되었습니다. 이것은 시작 쉘 스크립트입니다 launcher.sh:

cd /home/pi/ProjectName
venv/bin/python main.py &

그리고 이 쉘 스크립트는 시작 시 자동 실행을 위해 crontab에 등록됩니다.

$ sudo crontab -e

crontab 파일에 추가:

@reboot sudo su pi /home/pi/ProjectName/launcher.sh >> /home/pi/crontab.log 2>&1

이렇게 하면 stdout 또는 stderr에 대한 모든 출력이 로그 파일에 캡처됩니다.

드물게 이상한 상황에서 Python 코드가 실패하고 로그 파일에 포착되지 않은 오류가 기록됩니다 crontab.log. 그러나 로그 파일에 추가된 각 줄에 대한 타임스탬프가 없으면 문제를 분석하기가 어렵습니다. 문자만 있고 시간정보는 없습니다. 또한 장치를 다시 시작할 때마다 로그 파일이 재설정됩니다.

물론 현재 날짜/시간으로부터 일부 동적 로그 파일 이름을 생성할 수 있으므로 이것이 주요 문제는 아닙니다. 그러나 로그 파일에 대한 모든 기여가 타임스탬프로 보완되도록 로깅을 설정하는 방법을 모르겠습니다.

답변1

1990년대에 세계는 이를 달성하기 위한 도구를 발명했습니다. 쉘 스크립트에서 그것들을 다시 만들 필요가 없습니다. 엄격한 크기 제한, 자동 회전, 주문형 회전, 타임스탬프 이름 지정, 로그 파일 및 각 출력 줄 시작 부분의 타임스탬프를 제공합니다.

multilog행 타임스탬프는 , 및 의 기본이 아닌 옵션이며 s6-log명령 svlogdtinylog옵션/인수에 의해 활성화됩니다. cyclog무조건 타임스탬프를 추가하세요.

이러한 여러 도구에 의해 추가된 TAI64N 타임스탬프는 다음과 같습니다(예:https://unix.stackexchange.com/a/294276/5132)은 시간대 및 DST 변경의 영향을 받지 않으며 기계가 처리하기 쉽고 tai64nlocal필터를 통해 사람이 읽을 수 있는 형식으로 간단히 변환할 수 있습니다.

Kusalananda의 cron 테이블 항목을 조정합니다.

@reboot sudo -u pi sh -c '~pi/ProjectName/launcher.sh 2>&1 cyclog ~pi/log/crontab' |

또는:

@reboot sudo -u pi sh -c '~pi/ProjectName/launcher.sh 2>&1 |여러 로그 ~pi/log/crontab'

더 나쁜 방법이 있습니다일부필터를 사용하면 다음과 같습니다 tai64n.

@reboot sudo -u pi sh -c '~pi/ProjectName/launcher.sh 2>&1 tai64n >> ~pi/crontab.log'

그러나 이는 로그 파일 크기 제한, 자동 순환 또는 타임스탬프 이름 지정을 적용하지 않습니다. 다음 단계는 피할 수 없는 재창조(더 나쁜 것은 쉘 스크립트에서)를 단축하고 내재된 불안정성 문제를 logrotate해결한 다음 logrotate위와 같이 1990년대로 점프하는 것입니다.

1990년대로 점프하는 또 다른 방법은 다음과 같이 시작하는 것입니다.서비스 매니저cron, 시스템 운영자가 및 를 사용하는 대신 런타임에 서비스를 중지/시작할 수 있도록 하는 여러 인스턴스, 데몬 컨텍스트 및 적절한 관리 메커니즘을 방지하는 것과 관련됩니다 @reboot.

일부 서비스 관리자에는 서비스 정의 메커니즘이 있습니다.완전히 피하다launcher.sh래퍼 스크립트 및 기타 항목이 필요합니다 sudo. 다음은 nosh 서비스 패키지(다른 서비스 정의 표시)로 변환된 시스템 단위(하나의 서비스 정의 표시)입니다.

%고양이 프로젝트 이름.서비스
[단위]
설명=https://unix.stackexchange.com/a/559920/5132
[제공하다]
사용자=pi
작업 디렉터리=/home/pi/%p
ExecStart=venv/bin/python main.py
[설치하다]
WantedBy=다중 사용자.대상
%
%시스템 제어 변환 systemd-units ./ProjectName.service
%
%시스템 제어 인쇄 서비스 스크립트./ProjectName
시작: #!/bin/nosh
start:#./ProjectName.service에서 생성된 시작 파일
시작: 사실
중지: #!/bin/nosh
stop:#./ProjectName.service에서 생성된 파일 중지
중지: 사실
실행: #!/bin/nosh
run:#./ProjectName.service에서 생성된 파일을 실행합니다.
실행: #https://unix.stackexchange.com/a/559920/5132
실행: envuidgid --supplement --pi
실행: userenv-fromenv
실행: chdir /home/pi/프로젝트 이름
실행: setuidgid --supplement --pi
실행: venv/bin/python main.py
다시 시작: #!/bin/sh
restart:#./ProjectName.service에서 생성된 파일을 다시 시작합니다.
재부팅: 절전 0.1
restart:exec false # 스크립트 매개변수를 무시합니다.
%

cyclog@ProjectNamenosh 서비스 관리 및 일반 daemontools 시리즈 서비스 관리의 경우 로깅(실행 등)을 위한 병렬(또는 유사한) 서비스 패키지도 cyclog설정 multilog하고 후자가 전자에 대한 로깅 서비스임을 서비스 관리자에게 알립니다.

nosh per-user-manager, systemd 및 Upstart와 같은 서비스 관리자는 사용자에게 권한이 없는 서비스를 구성, 실행 및 관리할 수 있는 메커니즘도 제공합니다.

추가 읽기

답변2

장치를 재부팅할 때 추가할 때 로그 파일이 재설정되어서는 안 됩니다. 재설정되면 파일을 비우거나 삭제하는 다른 메커니즘이 있습니다.

파일 이름에 현재 타임스탬프가 포함된 파일로 리디렉션하려면 다음을 date사용하여 로그 파일 이름을 생성할 수 있습니다.

$ date +'/home/pi/crontab-%Y%m%d.log'
/home/pi/crontab-20200101.log

crontab 일정에 다음을 사용하세요.

@reboot sudo -u pi /home/pi/ProjectName/launcher.sh >> "$(date +'/home/pi/crontab-\%Y\%m\%d.log')" 2>&1

각각은 crontab 파일 형식에서 특별하기 %때문에 이스케이프해야 합니다 . 또한 루트로 전환하는 대신 다음을 \%사용하기로 결정했습니다 .sudu -u pi그 다음에를 사용하여 사용자의 crontab 에 스케줄러를 pi추가하면 분명히 스케줄러의 필요성이 완전히 제거됩니다 .supisudo

이는 작업이 트리거될 때 장치 시계가 동기화된 경우 작동합니다. 그렇지 않으면 잘못된 타임스탬프를 받게 됩니다. 이에 대한 해결 방법은 sleep실제로 전화하기 전에 잠시 기다리는 것입니다 date.

Python 코드에서 개별 타임스탬프가 있는 출력 라인을 얻는 경우: 이는 Python 코드 자체에서 지원해야 할 가능성이 가장 높습니다.

간단한 해결 방법은 때때로, 아마도 15분마다 다른 cron 작업에서 로그 파일에 타임스탬프를 출력하는 것입니다. 그러나 이제 로그 파일 이름이 Python 스크립트가 시작된 시기에 따라 달라지기 때문에 이는 다소 어려워집니다.

해결책저것현재 로그 파일에 대한 심볼릭 링크가 있을 수 있습니다.

@reboot sudo -u pi sh -c 'logfile=$(date +'/home/pi/crontab-\%Y\%m\%d.log'); ln -s -f "$logfile" /home/pi/crontab.log; exec /home/pi/ProjectName/launcher.sh >>"$logfile" 2>&1'

*/15 * * * * date >>/home/pi/crontab.log

이렇게 하면 /home/pi/crontab.log래퍼 스크립트를 시작하기 전에 타임스탬프가 있는 로그 파일에 대한 심볼릭 링크가 생성됩니다(단, 한 줄 크론 일정으로는 다소 다루기 힘들기 때문에 리디렉션을 실제 래퍼 스크립트로 옮기는 것이 좋습니다).

date두 번째 작업은 15분마다 한 번씩 심볼릭 링크가 현재 가리키는 파일에 결과를 출력합니다 .

관련 정보