동일한 변수를 사용하여 공통 첨자에 동시에 액세스할 수 있는 스크립트 수에 제한이 있습니까?

동일한 변수를 사용하여 공통 첨자에 동시에 액세스할 수 있는 스크립트 수에 제한이 있습니까?

저는 Raspberry Pi4(OS는 Ubuntu Server)에서 작업에 대한 별도의 로그 파일을 생성하기 위해 약 10개의 스크립트를 작성했습니다. 이 스크립트는 crontab, ssh를 통해 활성화되고 12개의 Raspberry Pi MotionEye 보안 카메라에 쿼리하고 생성된 로그 파일과 이메일에서 수행하는 작업을 보고합니다. 이러한 스크립트는 서로 다른 크론 시간에 활성화되지만(그러나 그 중 3개는 정시에 실행되고 2개는 자정에만 실행됨) 실행이 때때로 겹칩니다. 현재 스크립트는 거의 자립적입니다. 내가 원하는 것은 이메일 전송을 수행하는 하위 스크립트를 생성하는 것입니다. 따라서 변경 사항이 있어도 모든 기본 스크립트에서 해당 작업을 따라갈 필요가 없습니다. 이를 테스트하기 위해 각각의 로그 파일(6, 9, 12, 4, 10, 12, 4행)에 서로 다른 텍스트 줄을 쓰는 7개의 테스트 스크립트 파일 TestFileA - TestFileG를 만들었습니다.

#!/bin/sh

export TLOG=/home/.myaccountname./TestDir/TestFileD.tmp
ALOG=/home/.myaccountname./TestDir/TestFileD.log
#####
echo "This TestFileD log contains 2 additional lines" >| $TLOG
echo "TestFileD, Line 1" >> $TLOG
echo "$(date "+%m-%d-%Y %T"): TestFileD Complete" >> $TLOG
cat $TLOG >> $ALOG
/home/.myaccountname./TestDir/SendLog.sh
echo "MailFile: "$MailFile >> $ALOG
rm $TLOG

그런 다음 각 스크립트는 동일한 $TLOG 변수에 별도의 임시 로그 파일 이름을 할당하고 기본적으로 다음과 같은 SendLog 하위 스크립트를 호출합니다.

#!/bin/sh

MailFile="$TLOG".txt
cat /home/.myaccountname./TestDir/_EmailHeader $TLOG >| $MailFile
cat $MailFile | /usr/sbin/ssmtp [email protected]
rm $MailFile

마지막으로, 한 시간에 한 번씩 정확히 동시에 7개의 테스트 스크립트를 모두 실행하는 crontab을 만들었습니다. 이것을 "라이브" 스크립트에 작성할 경우 동시에 동일한 변수를 사용하여 동일한 "하위 첨자"에 액세스하는 여러 스크립트에서 충돌이 발생하지 않도록 하기 위해 이 작업을 수행합니다. 지금까지 처음 2번의 crontab 실행 중 5번의 이메일만 받았습니다. 가장 최근(세 번째)에 이 작업을 수행했을 때 7개의 이메일을 모두 받았습니다. (7개의 로그 파일은 모두 매번 올바르게 생성됩니다.) 라이브 스크립트를 작성하기 전에 내가 하고 있는 일에 잘못된 점을 아는 사람이 있나요?

답변1

변수는 스크립트 간에 공유되지 않습니다. 환경 변수는 하위 프로세스에 복사됩니다(하위 프로세스가 시작될 때). 정보는 뒤로 흐르거나 옆으로 흐르지 않으며 프로세스가 시작된 후에도 흐르지 않습니다.

같은 레시피를 따르는 두 사람과 같습니다.
프로세스는 두 부분으로 구성됩니다.

  • 다음 레시피는 보조 저장소(디스크)에 저장된 코드입니다. 프로세스는 이를 변경할 수 없습니다. 프로세스 간에 공유할 수 있습니다(불변이므로 공유 부작용이 없습니다). 마치 그들 모두가 하나쯤은 가지고 있는 것 같습니다(자신만의 요리 책도 포함).
  • 상태: 변수 등 이것은 이것을 바꿀 수 있습니다. 공유되지 않습니다. 일부초기의상태는 레시피 또는 상위에서 가져옵니다. 그러나 변경 사항은 공유되지 않습니다. 그들은 모두 종이에 메모를 하는 것과 같습니다. 두 사람 모두 자신이 얼마나 멀리 이동했는지 추적합니다(프로그램 카운터). (이들 중 어느 것도 공유되지 않습니다).

이메일의 경우 이메일 전송 코드에 따라 다릅니다.

관련 정보