"Sleep" não é realmente a metáfora correta para este estado de processo se você não for um designer de kernel. "Esperar" seria uma descrição melhor. "Sleep" no sentido intuitivo de esperar para ser acordado é chamado de "Parado", mostrado como Z
.
O processo não está esperando para ser despertado pelo usuário, ele está aguardando que alguma condição específica seja atendida. Por exemplo, ele está lendo dados de um arquivo e aguardando que os dados sejam carregados do disco, ou esteja atendendo a uma conexão de rede e aguardando um pacote de entrada ou pausado por um tempo definido e aguardando o tempo limite expirar, etc. A única maneira de "acordar" é providenciar para que a condição seja satisfeita.
Como você descobriu, chamar strace -p $PID
(no Linux, ou o equivalente em outras variantes unix) pode lhe diga o que o processo está fazendo e, em particular, o que ele está esperando, de uma visão de baixo nível. No entanto, não há garantia de que isso forneça dados úteis. Um futex é um tipo de bloqueio e, em geral, a única maneira de saber quem deve liberar o bloqueio é entender com precisão o que o programa está fazendo e como as bibliotecas subjacentes usam esse recurso de bloqueio do núcleo.
É possível que os programas tenham parado de produzir saída porque deixaram de receber entrada. É possível que um dos programas esteja funcionando e os outros estejam esperando por ele. É possível que haja um bug no programa e os processos estejam em um impasse. Seja o que for, é um problema de aplicação, não um problema no sistema. Não há uma maneira genérica de fazer o programa “acordar”: o programa está funcionando normalmente. Pode não estar fazendo o que você quer, mas está fazendo o que foi escrito para fazer.