For the record, this is a bug in circus. Before, by removing the entry from self.processes, most of the code in kill_process() was a no-op. The only way processes got cleaned up before this fix is because the watcher invokes process.stop() after attempting to send various signals.