是否可以在bash脚本中使用ctrl+z将lftp进程发送到后台?

是否可以在bash脚本中使用ctrl+z将lftp进程发送到后台?

我们有一个数据库,每天晚上都会从中备份。备份文件是 6 个单独目录中的 6 个单独文件。备份成功后,所有部分将lftp到远程服务器。 lftp 命令由 bash 脚本生成,该脚本将输出重定向到名为 ftpfiles.sh 的文件,然后执行它。这是 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 &
...

相关内容