我们有一个数据库,每天晚上都会从中备份。备份文件是 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 &
...