우리는 매일 밤 백업되는 데이터베이스를 가지고 있습니다. 백업 파일은 6개의 개별 디렉터리에 있는 6개의 개별 파일입니다. 백업이 성공하면 모든 부분이 원격 서버로 이동됩니다. lftp 명령은 출력을 ftpfiles.sh라는 파일로 리디렉션한 다음 실행하는 bash 스크립트에 의해 생성됩니다. ftpfiles.sh의 내용은 다음과 같습니다.
lftp -u user,pass 1.1.1.1 <<end_script
mkdir BackUp
cd BackUp
lcd /data10/customerBackup
put CUSTOMER.0.DBPART000.20220705010003.001
lcd /data1/customerBackup
put CUSTOMER.0.DBPART000.20220705010003.002
lcd /data2/customerBackup
put CUSTOMER.0.DBPART000.20220705010003.003
lcd /data7/customerBackup
put CUSTOMER.0.DBPART000.20220705010003.006
lcd /data8/customerBackup
put CUSTOMER.0.DBPART000.20220705010003.005
lcd /data9/customerBackup
put CUSTOMER.0.DBPART000.20220705010003.004
quit
end_script
exit 0
각 파일의 크기가 커서 이 프로세스를 완료하는 데 거의 7시간이 걸렸습니다. 그래서 이 파일들을 병렬로 보내고 싶습니다. mirror
파일을 병렬로 보낼 수 있는 lftp 옵션을 사용 하려면 포함 및 제외 항목을 많이 추가해야 하는데 이는 위험합니다. 또 다른 옵션은 put
각 프로세스를 백그라운드로 보내는 것입니다 . 다음은 명령줄의 단계입니다(bash 스크립트를 사용하지 않음).
[root@autodb /]# lftp -u user,pass 1.1.1.1
lftp [email protected].:~> mkdir BackUp
lftp [email protected].:~> cd BackUp
lftp [email protected].:~> lcd /data10/customerBackup
lftp [email protected].:~> put CUSTOMER.0.DBPART000.20220705010003.001
'CUSTOMER.0.DBPART000.20220705010003.001' at 40555088 (1%) [Sending data] {I PRESSED CTRL+Z IN HERE}
[0] put CUSTOMER.0.DBPART000.20220705010003.001 &
CUSTOMER.0.DBPART000.20220705010003.001 (8%) 45.85M/s eta:74s [Sending data]
lftp [email protected].:~> quit
[111] Moving to background to complete transfers...
[root@autodb /]#
나는 이것을 bash 스크립트로 구현하려고 시도했지만 성공하지 못했습니다. 예를 들어 bash 스크립트에 넣으십시오.
(put CUSTOMER.0.DBPART000.20220705010003.001) &
put CUSTOMER.0.DBPART000.20220705010003.001 &
그렇다면 bash 스크립트에서 ctrl+z를 사용하여 lftp 프로세스를 백그라운드로 보낼 수 있습니까?
이는 lftp 명령을 생성하는 스크립트이기도 합니다.
FTPFILES1='/data1/cronJobs/ftpfiles.sh'
DBNAME=CUSTOMER
##ftp files
cd /data1/cronJobs/
cat /dev/null > ftpfiles.sh
echo "lftp -u $FTPUSER,$FTPPASSWD $FTPSRV <<end_script
mkdir BackUp
cd Backup " >> $FTPFILES1
BACKUP_FILE_ARRAY=( /data*/"${DBNAME,,}"Backup/"$DBNAME.0.DBPART000".$(date +%Y%m%d)* )
for BACKUP_FILE in "${BACKUP_FILE_ARRAY[@]}"
do
echo "lcd $(dirname $BACKUP_FILE)" >> $FTPFILES1
echo "put $(basename $BACKUP_FILE)" >> $FTPFILES1
done
echo "quit
end_script
exit 0 " >> $FTPFILES1
답변1
카니발에 대해 어떤 오해를 갖고 있나요? lftp 명령을 실행하면 더 이상 bash가 아니라 lftp 환경에 있으며 CTRL+Z가 없습니다. 귀하의 경우에는 6개의 별도 스크립트를 작성하는 것이 좋습니다. 파일당 하나입니다. 그런 다음 lftp만 호출하는 BASH 스크립트를 작성합니다. 그런 다음 &를 사용할 수도 있습니다. 예를 들어:
lftp -u user,pass 1.1.1.1 << script1 &
lftp -u user,pass 1.1.1.1 << script2 &
...