Asterisk에서 루트로 시작하는 동안 PowerShell 파일을 어떻게 실행하나요?

Asterisk에서 루트로 시작하는 동안 PowerShell 파일을 어떻게 실행하나요?

Asterisk가 시작/다시 시작될 때 PowerShell 파일을 실행하고 싶습니다.

나는.ps1/var/spool/별표 디렉터리에서 새 파일을 복사하여 Azure Storage 컨테이너로 전송해야 하는 파일 입니다. 이 파일은 마지막으로 기록된 모든 파일을 가져와서 Azure 컨테이너로 전송해야 합니다. 루트에서 수동으로 명령을 실행하면 작동합니다. 이는 Azure 컨테이너에 성공적으로 업로드된 로그 파일의 출력입니다.

Name                 BlobType  Length          ContentType                    L
                                                                              a
                                                                              s
                                                                              t
                                                                              M
                                                                              o
                                                                              d
                                                                              i
                                                                              f
                                                                              i
                                                                              e
                                                                              d
----                 --------  ------          -----------                    -
out-067…9249.0.wav BlockBlob 44              application/octet-stream       2
uploaded!

모든 새로운 녹음을 얻으려면 무한히 실행되어야 합니다(매분마다 새 파일을 확인). 이를 위해 sleep 60명령이 포함된 루프 do/while($true)를 사용했습니다. 시스템이 재부팅되거나 전원이 꺼지면 OS 부팅 후 이 파일(ps1)이 다시 실행되기를 원합니다.

pwsh /var/spool/transferrecordings.ps1이를 위해 명령을 추가해 보았습니다./etc/rc.local시스템을 다시 시작할 때 작동하도록 만드세요. 디렉토리를 vi /etc/rc.local다음과 같이 편집했습니다.

이것은 내가 디렉토리에서 사용하는 스크립트입니다 /etc/rc.local.


# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.

pwsh /var/spool/transferrecordings.ps1
exit 0

하지만 서버가 시작되면 아무 일도 일어나지 않는 것 같습니다.

crontab -e다음 명령을 추가하여 crontab을 편집 해 보았습니다 @reboot pwsh /var/spool/transferrecordings.ps1. 다시는 아무것도 없습니다.

저는 Sangoma Linux(CentOS 3.10.0)를 사용하고 있습니다.

어떤 제안이 있으십니까?

답변1

(OP뿐만 아니라 이 답변을 접한 다른 유저들도 활용하길 바라는 마음으로 글을 씁니다.)

이러한 유형의 문제를 해결하는 방법에는 여러 가지가 있으며, 각 접근 방식의 문제와 장단점도 있습니다. 일반적으로 모든 CPU/RAM을 사용하는 프로세스가 지속적으로 실행되는 것을 원하지 않습니다. 그렇지 않으면 시스템을 사용할 수 없습니다!

코드를 "영원히" 반복하는 데몬으로 작성할 수 있지만 루프 반복 사이에는 다른 프로세스/프로그램도 서비스되도록 유휴/비활성/절전 상태로 전환됩니다. 동시성, 경쟁 조건, 교착 상태, 예상치 못한 종료 시 재시작 처리, 심지어 의도적으로 실행하지 않는 한 동일한 데몬을 두 번 이상 실행하지 않도록 하는 등 데몬 모드에서 알아야 할 사항이 많이 있습니다. 안전하게 수행하는 방법을 이해하십시오. 여기서는 이에 대해 더 자세히 설명하지 않겠습니다. 웹에서 "데몬 작성"을 검색해 보세요.

또 다른 접근 방식은 시스템 이벤트(예: 새 파일 생성, 수정, 액세스 등)에 의해 트리거되는 다양한 시스템 모니터링 도구를 사용하는 것입니다. 이 방법에는 몇 가지 문제가 있으며 안전하게 사용하는 방법을 이해하지 못하면 시스템이 중단될 수 있습니다. 여기서도 그의 접근 방식에 대해 더 이상 자세히 설명하지 않겠습니다. 이 방법이 가장 적합하다고 생각되면 "파일 시스템 이벤트 알림"을 ​​검색하십시오.

또 다른 방법(그리고 더 많은 방법)은 cron명령을 실행하는 대부분의 un*x 시스템에 공통적인 데몬을 사용하거나 1분에 한 번씩 쉘 스크립트를 주기적으로 사용하는 것입니다. 이 접근 방식에는 함정이 있지만 일반적으로 이를 방지하기 위한 조치를 취하는 것이 더 쉽습니다. 조정해야 할 가장 큰 문제는 일반적으로 쉘 스크립트(또는 powershell 또는 perl/pythen/기타 명령/스크립트)가 처리하도록 설계되어야 한다는 것입니다.한번만무한 루프 대신 매번 실행됩니다. cron계속해서 반복 해 보겠습니다 . ( cron자체적으로는 데몬으로 실행되고 데몬이 되는 데 따른 모든 세부 사항과 많은 문제를 처리하도록 신중하게 설계되었으므로 그럴 필요가 없습니다.) 처리가 완료되면 즉시 종료됩니다. 가능한 한 시스템과 사용자가 좋아하는 게임 플레이 등 다른 작업을 다시 수행할 수 있도록 합니다. ;-)

일반적으로 알아야 할 "크론 작업"과 관련된 가장 큰 문제는 다음과 같습니다.

1: 중복을 방지하고 명령/스크립트 내에서 루프 반복(특히 무한 루프!)을 방지할 수 있도록 간격을 충분히 멀리 설정합니다. 그렇지 않으면 이전 프로세스가 여전히 반복 중이더라도 cron은 새 프로세스를 시작합니다. 머지않아 수백 또는 수천 개의 동일한 스크립트가 실행되고, 반복되고, 서로 충돌하여 CPU, RAM 등을 소모하게 될 것입니다.

2: 이전 항목과 관련하여 스크립트에서 다음을 수행하기를 원합니다.그리고 완료cron-- 위에서 설명한 대로 티켓이 다시 실행되기 전에 가능한 한 빨리 수행해야 하는 작업입니다 .만약에두 번의 반복이 겹칠 가능성이 있으며(예를 들어 네트워크를 통해 대용량 파일을 복사할 때 이런 일이 발생할 수 있음) 잠재적인 동시성 문제, 교착 상태 등에 대해 계획을 세워야 합니다. (많은 스크립트가 최신 버전을 추적하여 이를 처리합니다.) *.pid 파일의 PID(프로세스 ID)는 이전 반복이 아직 진행 중인지 감지하고 이전 반복이 여전히 구현을 실행 중이면 "새"를 중단합니다. )

3: 이 상황과 관련하여 스크립트의 여러 프로세스가 트리거되면 그 중 하나만 복사 작업을 수행하는지 확인해야 합니다. 그렇지 않으면 정확히 동일한 파일/데이터를 복사하려고 할 때 충돌이 발생합니다. (이것이 이전 실행이 완료되지 않았음을 감지할 때 *.pid 메소드를 사용하여 중단하는 이유입니다. 이 모든 작업을 수행하는 방법에 대한 세부 사항은 독자들이 검색 및 연구를 연습할 수 있도록 남겨두겠습니다. 기술..)

4: 고려해야 할 마지막 문제는 사용자 액세스 및 권한입니다. 이 cron도구는 다양한 모드에서 실행됩니다. 하나는 명령/스크립트를 실행할 사용자 계정을 "crontab" 구성에 알려야 하는 시스템 모드입니다.저것사용자 계정에 대한 권한; 또 다른 모드는 사용자별 모드입니다. 여기서 cron명령/스크립트를 실행하는 사용자 계정은 이미 암시적이므로 이미 알려져 있습니다. ( cron실제로 참고하세요.아니요 user ~/.bashrc등을 실행하므로 필요한 경우 명령/스크립트에 포함시켜야 합니다. )

경우에 따라 알아야 할 다른 문제도 있으므로 이러한 문제를 이해하고 문제가 발생할 경우 처리하는 방법을 이해하는 것이 중요합니다. 이미 인터넷에는 많은 정보가 있으므로 cron여기서는 반복하지 않겠습니다. 온라인으로 검색해 보세요.

rsyncOP의 마지막 참고 사항으로 가능하면 이 명령을 사용하는 방법을 배우는 것이 좋습니다 . 여기에는 복사 방법/내용을 제어하고, 파일이 이미 존재하는지 감지하고, 한 파일이 다른 파일보다 오래되었거나 최신인지 감지하는 등 유용할 수 있는 더 많은 기능이 있습니다.

관련 정보