【问题标题】:bash script exits with zero status even after kill signal即使在终止信号之后,bash 脚本也会以零状态退出
【发布时间】:2021-06-28 13:30:42
【问题描述】:

即使在中断脚本后我仍然保持零状态。

第一个脚本

#!/bin/bash

## call the backup script
/usr/local/bin/backup 2>&1 >/dev/null
echo $?

备份

#!/bin/bash

exitscript() {
 rm -f $LOCKFILE

 echo "Script Status: $1 | tee -a ${LOG}"
 echo "> End Date: $(date +'%d.%m.%Y %H:%M:%S')" | tee -a ${LOG}
 exit $1
}

######START#######
trap "exitscript 1" 1 2 23 24 25

rsync ${args} ${src} ${dest} | tee -a ${RSYNC_LOG}
retcode=${PIPESTATUS[0]}
if [[ ${retcode} -ne 0 ]]; then
  exitcode=1
fi

exitscript ${exitcode:-0}

当第一个脚本运行时,它返回退出状态 0 尽管我试图在它结束之前终止备份脚本(为此我创建了一个非常大的文件,因此 rsync 需要时间来复制文件并且我有时间在脚本结束前杀死它)

ps -ef | grep -i backup
kill $PID 

另一件事是,即使在杀死备份脚本之后,rsync 仍然运行。一旦脚本被杀死并且我的第一个脚本返回零状态代码,我希望 rsync 停止。 非常感谢任何建议。谢谢!

【问题讨论】:

    标签: linux bash rsync kill exitstatus


    【解决方案1】:

    我认为echo "Script Status: $1 | tee -a ${LOG} 中缺少的引号与问题无关。
    当您想要一个函数来处理陷阱时,您需要导出该函数。
    当你想杀死孩子时,你应该在你的陷阱函数中添加这些。

    我使用sleep 命令测试了这些调整,它也应该适用于rsync

    #!/bin/bash
    
    exitscript() {
     echo "Script Status: $1"
     (( $pleasekill > 0 )) && kill ${pleasekill}
     echo "> End Date: $(date +'%d.%m.%Y %H:%M:%S')"
     exit $1
    }
    
    # Export the function exitscript
    export exitscript
    
    ######START#######
    pleasekill=0
    trap "exitscript 1" 1 2 23 24 25
    # Start I/O-friendly rsync function
    sleep 30 &
    pleasekill=$!
    wait
    
    exitscript 2
    

    当您使用第一个脚本对此进行测试时,请使用 ^Ckill -1 pid_of_backup

    【讨论】:

    • 使用我的 Rsync 命令时,有时我希望在用户使用详细时在屏幕上看到输出,同时将其保存到日志文件中。通过将其发送到后台,我将无法做到这一点吗?有没有其他方法可以获取进程的 PID 或任何解决方案来解决这两种情况?谢谢
    • 试试ps -efpgreppkill
    猜你喜欢
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 2014-12-03
    • 2016-04-16
    • 2019-03-24
    • 1970-01-01
    • 2022-09-30
    相关资源
    最近更新 更多