#1076 Issue closed: setting EXIT_CODE for Error functions is useless because rear kills itself that results exit code 143

Labels: cleanup, fixed / solved / done, minor bug

jsmeix opened issue at 2016-11-22 10:49:

While working on
I noticed that code like

Error 99 "error messsage"

does not let rear exit with exit code 99.

The reason seems that EXIT_CODE can be set
but that variable is nowhere evaluated:

$ find usr/share/rear/* | xargs grep 'EXIT_CODE'

usr/share/rear/layout/compare/default/500_compare_layout.sh:    EXIT_CODE=1
usr/share/rear/layout/compare/default/510_compare_files.sh:        EXIT_CODE=1
usr/share/rear/layout/save/NSR/default/650_check_iso_recoverable.sh:   EXIT_CODE=1
usr/share/rear/lib/_input-output-functions.sh:          EXIT_CODE=$1
usr/share/rear/lib/_input-output-functions.sh:          EXIT_CODE=1
usr/share/rear/lib/_input-output-functions.sh:    EXIT_CODE=1
usr/share/rear/lib/_input-output-functions.sh:        EXIT_CODE=$1
usr/share/rear/lib/_input-output-functions.sh:    # Call Error explicitly with the above set EXIT_CODE:
usr/share/rear/lib/_input-output-functions.sh:    Error $EXIT_CODE "

I.e. there is nowhere a $EXIT_CODE except my recent change in
where I call "Error $EXIT_CODE"
but that does not let rear exit with that EXIT_CODE value.

jsmeix commented at 2016-11-22 10:52:

$ git log -p --follow usr/share/rear/lib/_input-output-functions.sh

shows that EXIT_CODE was initially introduced
by Dag Wieers.

can you tell me how EXIT_CODE is meant to be used?

jsmeix commented at 2016-11-22 14:44:

I found where $EXIT_CODE is used:
In usr/sbin/rear there is the very last line


but somehow that does not work - at least not via e.g.

Error 99 "error messsage"

jsmeix commented at 2016-11-24 15:32:

Found the reason:

Using in a script


works as expected:
rear exits with that exit code.

In contrast using in a script

Error 99 "test error 99"

exits rear always with exit code 143 which means
usually the program caught a SIGTERM signal
i.e. the process was killed.
For rear it is USR1 that kills it via

# activate the trap function
builtin trap "DoExitTasks" 0
# keep PID of main process
readonly MASTER_PID=$$
# duplication STDOUT to fd7 to use for Print
exec 7>&1
QuietAddExitTask "exec 7>&-"
# USR1 is used to abort on errors, not using Print to always print to the original STDOUT, even if quiet
builtin trap "echo 'Aborting due to an error, check $LOGFILE for details' >&7 ; kill $MASTER_PID" USR1
Error() {
        kill -USR1 $MASTER_PID # make sure that Error exits the master process, even if called from child processes :-)

so that setting EXIT_CODE for Error functions is useless.

jsmeix commented at 2016-11-24 15:40:

I think I will simply remove the EXIT_CODE stuff
from the Error functions.

The only usage of EXIT_CODE in Error functions is

$ find usr/sbin/rear usr/share/rear/* | xargs grep 'Error [0-9][0-9]* '
usr/share/rear/prep/BACULA/default/500_check_BACULA_bconsole_results.sh:StopIfError 1 "Bacula client status unknown on director."
usr/share/rear/prep/BAREOS/default/500_check_BAREOS_bconsole_results.sh:StopIfError 1 "Bareos client status unknown on director."
usr/share/rear/verify/BACULA/default/050_check_requirements.sh:   StopIfError 1  "Bacula configuration file (bconsole.conf) missing"
usr/share/rear/verify/BAREOS/default/050_check_requirements.sh:   StopIfError 1  "Bareos configuration file (bconsole.conf) missing"

that I can easily adapt.

jsmeix commented at 2016-11-24 17:40:

Fixed via https://github.com/rear/rear/pull/1084

[Export of Github issue for rear/rear.]