The problem with Runtime.exec is that it uses "SIGCHLD" and waitpid to clean up after the created subprocess. Since frysk is also managing those kernel interfaces a chash occures. Instead the code should more directly use frysk.sys.Fork.exec or similar to create the child process.
The method frysk.sys.Fork.daemon() would be best as it re-parents the process to not be frysk. Of course, this also has the disadvantage of not being able to determine when the program fails to start.
Converted to use frysk.sys.Fork.daemon(). Now causes backtraces on initial activation. This has been enumerated in bz #3927.