bashubuntuunixrunit

Runit exits with error if process tells itself to go down


I'm seeing some unexpected behavior with runit and not sure how to get it to do what I want without throwing an error during termination. I have a process that sometimes knows it should stop itself and not let itself be restarted (thus should call sv d on itself). This works if I never change the user but produces errors if I switch to a non-root user when running.

I'll use the same finish script for both examples:

#!/bin/bash -e
echo "downtest finished with exit code $1 and exit status $2"

The run script that works as expected (prints downtest finished with exit code 0 and exit status 0 to syslog):

#!/bin/bash -e
exec 2>&1
echo "running downtest"
sv d downtest
exit 0

The run script that doesn't work as expected (prints downtest finished with exit code -1 and exit status 15 to syslog):

#!/bin/bash -e
exec 2>&1
echo "running downtest"
chpst -u ubuntu sudo sv d downtest
exit 0

I get the same result if I use su ubuntu instead of chpst.

Any ideas on why I see this behavior and how to fix it so calling sudo sv d downtest results in a clean process exit rather than returning error status codes?


Solution

  • sv d sends a SIGTERM if the process is still running. This is signal 15, hence the error being handled in the manner in question.

    By contrast, to tell a running program not to start up again after it exits on its own (thus allowing that opportunity), use sv o (once) instead.

    Alternately, you can trap SIGTERM in your script when you're expecting it:

    trap 'exit 0' TERM
    

    If you want to make this conditional:

    trap 'if [[ $ignore_sigterm ]]; then exit 0; fi' TERM
    

    ...and then run

    ignore_sigterm=1
    

    before triggering sv d.