Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 运行bash脚本将进程发送到后台_Linux_Bash_Shell - Fatal编程技术网

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

Linux 运行bash脚本将进程发送到后台,linux,bash,shell,Linux,Bash,Shell,嗨,我正在制作一个脚本来执行一些rsync进程,对于rsync进程,Sys admin已经创建了该脚本,当它运行时,它会询问select选项,所以我想创建一个脚本来从脚本传递该参数,并从cron运行它 rsync从文件中获取的目录列表 filelist=$(cat filelist.txt) for i in filelist;do echo -e "3\nY" | ./rsync.sh $i 这将创建一个rsync日志文件 因此,我检查日志文件的某个值,如果该值为空,则移动到第二个

嗨,我正在制作一个脚本来执行一些rsync进程,对于rsync进程,Sys admin已经创建了该脚本,当它运行时,它会询问select选项,所以我想创建一个脚本来从脚本传递该参数,并从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进程需要发送到后台并将下一个文件循环。我用screen命令检查,但screen不能与服务器一起工作。此外,我还需要获取运行进程并传递到日志所需的持续时间,当我使用time命令时,我无法传递echo变量。还需要将此文件发送到后台并获取下一个文件。感谢您为完成此任务提供的任何建议

问题: 1.如何使用Time命令发送参数 echo-e3\nY | time./rsync.sh$i 一个以上的不起作用

如何在运行前一个rsync进程时将此文件发送到后台并将下一个文件传送到rsync。 完整代码

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

如果您想计时,可以使用:

time sleep 3
如果你想计时两件事,你可以在第二次睡眠后做一个复合语句,如下面的注释分号:

因此,您可以这样做来计时您的回声,这将不需要任何时间和您的rsync:

如果要在后台执行此操作:

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
#!/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如果我理解正确,您需要对rsync计时

我的第一次尝试是使用echo xxxx | time rsycnc。在我的聚会上,这是如何打破或不应该工作?。我通常使用Zsh而不是bash,在zsht上,这确实运行良好


如果对您来说使用bash很重要,因为回音的时间可能会被忽略,另一种选择是对整个管道进行计时,即time echo xxxx | time rsync,或者更简单的time rsync。您的问题是什么?如何将其发送到后台,以及如何使用time命令从echoNo friend传递变量,它不起作用,它没有给出目录发现错误。在我给出的示例中没有提到目录,因此此错误与讨论的主题无关,即定时命令和启动后台进程。显示实际代码的列表,以及确切的错误消息。。。话虽如此,我希望你没有照搬我的代码,而是根据你的具体需要对其进行了修改,是吗???看着完整的代码,我注意到:1你没有启动任何后台过程,我只是为了完整性才提到这一点。2您没有指出,代码中的哪一行给出了directory not found,我猜这是带有rsync.sh命令的行。3您没有指出找不到哪个目录这行中提到了两个目录,另外错误也可能来自rsync.sh脚本内部。如果没有这些信息,就很难给出任何建议…这是可行的,但我无法将超时时间放到日志文件中,而且一旦我将此文件发送到后台时间{echo-e3\nY |/rsync.sh$I;}>/time_result/$b_I-$date,这也不是下一个文件
(time rsync <(echo xxxx) >output.txt 2>error.txt) &