运行bash脚本以将进程发送到后台

时间:2016-10-06 06:41:32

标签: linux bash shell

我正在制作一个脚本来做一些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 以上一个不工作

  1. 如何将此发送到后台并在运行上一个rsync进程时将下一个文件带到rsync。
  2. 完整代码

    #!/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
    

2 个答案:

答案 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 命令当然会产生输出(这就是它的用途),并且您不希望在后台接收程序的输出。解决方案是重定向输出:

&