Search code examples
linuxbashrsynckillexitstatus

bash script exits with zero status even after kill signal


I keep getting zero status even after interrupting the script.

The first script

#!/bin/bash

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

backup

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

When the First Script is run, it returns exit status of 0 although i have tried to kill the backup script before it ends (for that i have created a very large size file so that rsync takes time to copy the file and i get the time to kill the script before it ends)

ps -ef | grep -i backup
kill $PID 

Another thing is that even after killing the backup script, rsync still runs. I would like for rsync to stop once the script is being killed and my first script to return the status code of zero. Much appreciation for any suggestions. Thanks!


Solution

  • I assume the missing quote in echo "Script Status: $1 | tee -a ${LOG} is not relevant to the question.
    When you want a function to handle the trap, you need to export that function.
    And when you want to kill children, you should add these in your trap-function.

    I tested these adjustments with a sleep command, it should work for rsync too.

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

    When you test this with the first script, use ^C or kill -1 pid_of_backup.