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
여기서는 반복하지 않겠습니다. 온라인으로 검색해 보세요.
rsync
OP의 마지막 참고 사항으로 가능하면 이 명령을 사용하는 방법을 배우는 것이 좋습니다 . 여기에는 복사 방법/내용을 제어하고, 파일이 이미 존재하는지 감지하고, 한 파일이 다른 파일보다 오래되었거나 최신인지 감지하는 등 유용할 수 있는 더 많은 기능이 있습니다.