bashbackgroundcronzombie-processdefunct

Why do processes spawned by cron end up defunct?


I have some processes showing up as <defunct> in top (and ps). I've boiled things down from the real scripts and programs.

In my crontab:

* * * * * /tmp/launcher.sh /tmp/tester.sh

The contents of launcher.sh (which is of course marked executable):

#!/bin/bash
# the real script does a little argument processing here
"$@"

The contents of tester.sh (which is of course marked executable):

#!/bin/bash
sleep 27 & # the real script launches a compiled C program in the background

ps shows the following:

user       24257 24256  0 18:32 ?        00:00:00 [launcher.sh] <defunct>
user       24259     1  0 18:32 ?        00:00:00 sleep 27

Note that tester.sh does not appear--it has exited after launching the background job.

Why does launcher.sh stick around, marked <defunct>? It only seems to do this when launched by cron--not when I run it myself.

Additional note: launcher.sh is a common script in the system this runs on, which is not easily modified. The other things (crontab, tester.sh, even the program that I run instead of sleep) can be modiified much more easily.


Solution

  • Because they haven't been the subject of a wait(2) system call.

    Since someone may wait for these processes in the future, the kernel can't completely get rid of them or it won't be able to execute the wait system call because it won't have the exit status or evidence of its existence any more.

    When you start one from the shell, your shell is trapping SIGCHLD and doing various wait operations anyway, so nothing stays defunct for long.

    But cron isn't in a wait state, it is sleeping, so the defunct child may stick around for a while until cron wakes up.


    Update:   Responding to comment... Hmm. I did manage to duplicate the issue:

     PPID   PID  PGID  SESS COMMAND
        1  3562  3562  3562 cron
     3562  1629  3562  3562  \_ cron
     1629  1636  1636  1636      \_ sh <defunct>
        1  1639  1636  1636 sleep
    

    So, what happened was, I think: