bash 스크립트에서 ctrl+z를 사용하여 lftp 프로세스를 백그라운드로 보낼 수 있습니까?

bash 스크립트에서 ctrl+z를 사용하여 lftp 프로세스를 백그라운드로 보낼 수 있습니까?

우리는 매일 밤 백업되는 데이터베이스를 가지고 있습니다. 백업 파일은 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 &
...

관련 정보