So I quit everything else, SIGCONT'd Safari, and it started responding again, so I tried unsuccessfully to close some tabs. Of course, Safari somewhat isolates pages in separate processes, so I ran `ps aux | grep WebContent | grep -v grep | cut -d' ' -f11 | xargs kill -SIGCONT` as well.
It all sprang back to life, and all the tabs I'd shut in vain zipped away. Got that one saved for later. It's probably easier just to use -1 now I've learned what that is!
I do wonder what's suspending these processes indefinitely. I should have done more inspection to see what state they were in. I'm not familiar with how WebKit content threads communicate though, so that's for another day.
/* must be run as root */
#include <signal.h>
main(){for(;;){kill(-1,SIGCONT);sleep(10);}}
and a .plist. Temporary hackaround. -1
All processes with pid larger than 1 will be signaled. -1 If superuser, broadcast the signal to all processes; otherwise
broadcast to all processes belonging to the user.
(This is on macOS/iOS, Linux might have slightly different semantics.)Tomcat 7.0.72 from Homebrew, Oracle Java 8u112, PostgreSQL 9.3 and 9.5.