我正在制作一个脚本来做一些rsync过程,对于rsync进程,Sys管理员创建了脚本,当它运行时它询问选择选项,所以我想创建一个脚本来从脚本传递该参数并运行它来自cron。
rsync从文件中获取的目录列表。
filelist=$(cat filelist.txt)
for i in filelist;do
echo -e "3\nY" | ./rsync.sh $i
#这将创建一个rsync日志文件 所以我检查日志文件的某些值,如果它是空的我移动到第二个文件。如果文件不为空,我必须启动rsync进程,如下所示,这将需要2个多小时。
if [ a != 0 ];then
echo -e "3\nN" | ./rsync.sh $i
上面的rsync进程需要发送到后台并将下一个文件循环。我检查屏幕命令,但屏幕不能与服务器一起使用。我还需要获取运行进程并传递给日志的持续时间,当我使用time命令时,我无法传递echo变量。还需要将此发送到后台并获取下一个文件。感谢任何有关此任务成功的建议。
问题 1.如何使用Time命令发送参数 echo -e" 3 \ nY" |时间./rsync.sh $ i 以上一个不工作
完整代码
#!/bin/bash
filelist=$(cat filelist.txt)
Lpath=/opt/sas/sas_control/scripts/Logs/rsync_logs
date=$(date +"%m-%d-%Y")
timelog="time_result/rsync_time.log-$date"
for i in $filelist;do
#echo $i
b_i=$(basename $i)
echo $b_i
echo -e "3\nY" | ./rsync.sh $i
f=$(cat $Lpath/$(ls -tr $Lpath| grep rsync-dry-run-$b_i | tail -1) | grep 'transferred:' | cut -d':' -f2)
echo $f
if [ $f != 0 ]; then
#date=$(date +"%D : %r")
start_time=`date +%s`
echo "$b_i-start:$start_time" >> $timelog
#time ./rsync.sh $i < echo -e "3\nY" 2> "./time_result/$b_i-$date" &
time { echo -e "3\nY" | ./rsync.sh $i; } 2> "./time_result/$b_i-$date"
end_time=`date +%s`
s_time=$(cat $timelog|grep "$b_i-start" |cut -d ':' -f2)
duration=$(($end_time-$s_time))
echo "$b_i duration:$duration" >> $timelog
fi
done
答案 0 :(得分:0)
如果您想要时间,可以使用:
time sleep 3
如果你想计算两件事,你可以做这样的复合语句(在第二sleep
之后注意分号):
time { sleep 3; sleep 4; }
所以,你可以这样做来计算你的echo
(根本不需要时间)和rsync
:
time { echo "something" | rsync something ; }
如果您想在后台执行此操作:
time { echo "something" | rsync something ; } &
完整代码
#!/bin/bash
filelist=$(cat filelist.txt)
Lpath=/opt/sas/sas_control/scripts/Logs/rsync_logs
date=$(date +"%m-%d-%Y")
timelog="time_result/rsync_time.log-$date"
for i in $filelist;do
#echo $i
b_i=$(basename $i)
echo $b_i
echo -e "3\nY" | ./rsync.sh $i
f=$(cat $Lpath/$(ls -tr $Lpath| grep rsync-dry-run-$b_i | tail -1) | grep 'transferred:' | cut -d':' -f2)
echo $f
if [ $f != 0 ]; then
#date=$(date +"%D : %r")
start_time=`date +%s`
echo "$b_i-start:$start_time" >> $timelog
#time ./rsync.sh $i < echo -e "3\nY" 2> "./time_result/$b_i-$date" &
time { echo -e "3\nY" | ./rsync.sh $i; } 2> "./time_result/$b_i-$date"
end_time=`date +%s`
s_time=$(cat $timelog|grep "$b_i-start" |cut -d ':' -f2)
duration=$(($end_time-$s_time))
echo "$b_i duration:$duration" >> $timelog
fi
done
答案 1 :(得分:0)
你的问题不是很清楚,但我会尝试:
(1)如果我理解正确,你想要rsync
的时间。
我的第一次尝试是使用echo xxxx | time rsycnc
。在我的bash
上,这被打破了(或者不应该工作?)。我通常使用Zsh而不是bash,而在zsht上,这确实运行良好。
如果你使用bash很重要,那么另一种选择(因为echo
可能被忽略的时间)将是整个管道的时间,即time (echo xxxx | time rsync)
,甚至更简单{ {1}}
(2)要将流程发送到后台,请在该行中添加time rsync <(echo xxxx)
。但是, time 命令当然会产生输出(这就是它的用途),并且您不希望在后台接收程序的输出。解决方案是重定向输出:
&