Hi all,

I'm trying to understand what happens when a shell command exits in ansible 
in sync vs. async modes. It seems that in the former case there is a SIGHUP 
sent and in the latter there isn't. To test this I created a startup script 
for a background process that runs forever:

start_run_forever.sh:
- - - - - - - - - - - - -

#!/usr/bin/bash


strace -o ~/debug-start sh /home/asb_service/run_forever.sh &

echo "Done"
- - - - - - - - - - - - -
run_forever.sh:

- - - - - - - - - - - - -

#!/usr/bin/bash


while true

do

    echo "here"

    sleep 5

done
- - - - - - - - - - - - -

When I run an ad-hoc command synchronously, the run_forever.sh script 
starts and then receives a SIGHUP when the terminal exits, as I'd expect.

ansible -vvv {myhost} -i environments/dev -m shell -a 
"~/start_run_forever.sh" -u {myuser}


strace output:

...
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0 
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0 
rt_sigaction(SIGINT, {sa_handler=0x43e910, sa_mask=[], sa_flags=SA_RESTORER, 
sa_restorer=0x7f60b1587400}, {sa_handler=SIG_IGN, sa_mask=[], 
sa_flags=SA_RESTORER, sa_restorer=0x7f60b158740 0}, 8) = 0 
rt_sigaction(SIGINT, {sa_handler=SIG_IGN, sa_mask=[], sa_flags=SA_RESTORER, 
sa_restorer=0x7f60b1587400}, {sa_handler=0x43e910, sa_mask=[], 
sa_flags=SA_RESTORER, sa_restorer=0x7f60b158740 0}, 8) = 0 
wait4(-1, [{WIFSIGNALED(s) && WTERMSIG(s) == SIGHUP}], 0, NULL) = 22102 
--- SIGHUP {si_signo=SIGHUP, si_code=SI_KERNEL} --- 
+++ killed by SIGHUP +++


but when I run in async mode it never receives the SIGHUP and keeps 
running, which I would not expect to happen.

ansible -B 10 -P 5 -vvv {myhost} -i environments/dev -m shell -a 
"~/start_run_forever.sh" -u {myuser}

strace output:

...
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 22395
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=22395, si_uid=2153, 
si_status=0, si_utime=0, si_stime=0} ---
wait4(-1, 0x7ffcd93f6010, WNOHANG, NULL) = -1 ECHILD (No child processes)
rt_sigreturn({mask=[]})                 = 0
rt_sigaction(SIGINT, {sa_handler=SIG_IGN, sa_mask=[], sa_flags=SA_RESTORER, 
sa_restorer=0x7fb5e2e1d400}, {sa_handler=SIG_IGN, sa_mask=[], 
sa_flags=SA_RESTORER, sa_restorer=0x7fb5e2e1d40\
0}, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
write(1, "here\n", 5)                   = -1 EPIPE (Broken pipe)
...


I've tried this with 2.5.0 and 2.6.4 and the behavior is the same. I know 
the right way to start a background process is to use "nohup" but 
developers on our project were relying on this behavior of async to start 
background processes in production code. At this point I am just curious 
whether it's a feature or a bug in ansible because I can't find any 
documentation about this.

Thanks,
Sarah




-- 
You received this message because you are subscribed to the Google Groups 
"Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to ansible-project+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/ansible-project/9d7ed45f-92c0-4b48-8675-82d8afb8816fo%40googlegroups.com.

Reply via email to