Cron에서 Bash 스크립트로 Bash 스크립트에서 Expect 스크립트로

Cron에서 Bash 스크립트로 Bash 스크립트에서 Expect 스크립트로

일련의 Expect 스크립트를 실행하고 싶습니다. 실행 체인은 다음과 같습니다. cron 작업은 bash 스크립트를 시작하고 이 래퍼는 약 11개의 bash 스크립트를 시작합니다. Parallel각각은 하나를 호출합니다 Expect.

Expect부분까지는 모든 것이 괜찮았습니다. 두 번째 Bash 스크립트의 병렬 섹션은 예상되는 각 스크립트의 호스트 이름을 파일에 표시합니다. 실제로 그룹으로 표시되지만 Expect 스크립트는 즉시 종료됩니다.

크론 작업 특성상 작업에 환경변수를 전달해야 한다고 들었습니다. 내가 지금까지 시도한 것 :

48 9 * * * rm /home/admin/.flag && /home/admin/.profile; /home/admin/nodeTest.sh

nodeTest의 중요한 코드는 다음과 같습니다.

for i in {1..10}; do
                for chunk in `ls /home/admin/assets/sagLogs/x*`; do
                        cat $chunk | parallel -j 11 -I% --max-args 1 /home/abdmin/oneNode.sh "%"
                        clear
                done
        done

이 블록의 길이는 11개의 호스트 이름입니다. 병렬 프로그램에 배치되고 Expect 스크립트는 oneNode를 통해 시작됩니다. oneNode는 호스트 이름을 IP로 변환하고 실행할 스크립트를 결정합니다.

이것은 명령줄에서 잘 작동합니다. 나에게 슬픔을 주는 것은 단지 Cron 작업입니다. tcl 명령이 문제를 일으킬 수 있다는 내용을 읽었 interact지만 내 스크립트에서는 이를 사용하지 않습니다. 병렬로 실행되는 선은 다음과 같습니다.

timeout 80 sudo expect /home/admin/assets/activeTest $sag $ip &

업데이트: 이전 줄을 다음으로 변경합니다.

timeout 80 sudo /usr/bin/expect /home/admin/assets/activeTest $sag $ip &

업데이트: Expect 스크립트에서 오류를 확인한 후 가져온 환경 변수가 누락되었습니다. 첫 번째 오류는 TERM변수 == 알 수 없기 때문에 발생합니다.

'unknown': I need something more specific.
    while executing
"exec /usr/bin/clear"
    invoked from within
"puts [exec /usr/bin/clear]"
    (file "/home/admin/assets/activeTest" line 35)

호출 스크립트(oneNode)에서 env를 덤프하면 해당 용어가 설정된 것을 볼 수 있습니다.

TEMR=vt100

따라서 래퍼에 설정되지만 예상 스크립트에서는 상속되지 않습니다. 무엇을 해야 할까요?

답변1

이건 틀렸어

48 9 * * * rm /home/admin/.flag && /home/admin/.profile; /home/admin/nodeTest.sh

가장 중요한 것은 당신이.profile을 명령으로 실행-- 한 번에 실행별도의 프로세스프로세스가 종료되면 모든 환경 수정 사항이 손실됩니다.

또한 .flag존재하지 않으면 어떻게 되나요? 구성 파일을 처리하지 않지만 계속 nodeTest 스크립트를 실행합니다.

.profile을 사용하는 것이 좋습니다 source. 이를 사용하면 rm -f파일이 손실되더라도 오류가 발생하지 않습니다. 그리고 .profile에 오류가 없는 경우에만 스크립트를 실행하십시오.

48 9 * * * rm -f /home/admin/.flag; . /home/admin/.profile && /home/admin/nodeTest.sh
# ..................................^
# source the .profile: execute it in the _current_ shell

다음,파싱되지 않음ls. 변화

            for chunk in `ls /home/admin/assets/sagLogs/x*`; do
                    cat $chunk | ...

도착하다

            for chunk in /home/admin/assets/sagLogs/x*; do
                    cat "$chunk" | ...

관련 정보