모든 것이 기다리는 대신 백그라운드에서 실행되어야 합니다.

모든 것이 기다리는 대신 백그라운드에서 실행되어야 합니다.

나는 사용자로부터 명령을 받아 대규모 서버 목록을 실행하고 단일 파일에 쓰는 스크립트를 작성했습니다. 작성이 완료되면 이메일이 전송됩니다. 내 요구 사항은 스크립트가 백그라운드에서 실행되고 완료되면 이메일을 보내야 한다는 것입니다.

나는 이것을 시도했지만 wait $PROC_ID &쓰기는 백그라운드에서 이루어지고 이메일은 빈 데이터와 함께 즉시 전송됩니다. 데이터가 파일에 기록되면 백그라운드에서 기다렸다가 메일을 트리거할 수 있습니까?

코드 출력:

The output can be monitored in /tmp/Servers_Output_list.csv .....................Please Be Patient
Mail will get triggered once completed

코드는 다음과 같습니다. 내 스크립트의 기능을 언급했습니다.

for i in `cat $file_name`
    do
        ssh -q -o "StrictHostKeyChecking no" -o "NumberOfPasswordPrompts 0" -o ConnectTimeout=2 $i "echo -n $i;echo -n ",";$command3" 2>>/dev/null &
    done >> $file_save &
    PROC_ID=$!
    echo "                                                "
    echo " The output can be monitored in $file_save....................Please Be Patient"
    echo "Mail will get triggered once completed"
    echo "                                    "
    wait $PROC_ID
    while true; do
        if [ -s $PROC_ID ];then
            echo "$PROC_ID process running Please check"
        else
            mailx -s "Servers Command Output" -a $file_save  <my [email protected]>
            break;
        fi
done &
exit 0;
fi

답변1

내가 올바르게 이해했다면 ssh 명령을 실행하고 완료될 때까지 기다렸다가 백그라운드에서 메일을 보내길 원할 것입니다. 이는 ssh 및 메일이 완료되기 전에 스크립트가 완료될 수 있음을 의미합니다.

그래서 저는 다음과 같은 해결책을 제안합니다.

#!/bin/bash

# Set to real file if you want "log output"
log_file=/dev/null

file_save=/whatever

command3=<some command here>

function exec_ssh
{
    for i in $(cat $file_name); do
        ssh -q -o "StrictHostKeyChecking no" -o "NumberOfPasswordPrompts 0" -o ConnectTimeout=2 $i "echo -n $i;echo -n ',';$1" 2>/dev/null &
    done >> $file_save
    wait
    mailx -s "Servers Command Output" -a $file_save  <my [email protected]>
}

# export function, so it is callable via nohup
export -f exec_ssh $command3

# clear file_save
>$file_save

# run exec_ssh in the background. 
# nohup keeps it running, even when this script terminates.
nohup exec_ssh &>$logfile &

# Inform user
echo " The output can be monitored in $file_save....................Please Be Patient"
echo "Mail will get triggered once completed"

exit 0

exec_ssh 함수는 모든 작업을 수행하고 백그라운드에서 실행됩니다 nohup. 이렇게 하면 터미널이 닫혀 있어도 스크립트가 완료되면 백그라운드 작업이 계속 실행됩니다.

사용자가 시스템에서 로그아웃하면 무슨 일이 일어나는지 잘 모르겠습니다.

답변2

또는

function doit () {
    ssh -q -o "StrictHostKeyChecking no" -o "NumberOfPasswordPrompts 0" -o ConnectTimeout=2 $1 "echo -n $1;echo -n ",";$command3" 2>>/dev/null &
}
export -f doit
C=$(cat $file_name | wc -l)    
cat $file_name | xargs -I {} -P $C bash -c "doit \"{}\"" >> $file_save
mailx -s "Servers Command Output" -a $file_save  <my [email protected]>

관련 정보