Parece ser uma corrida de colheita. O processo de chamada (sockd?) configura o manipulador SIGCHLD, o qual reage a test.sh em vez de pam_exec. veja link
Editar: desculpe, deixe-me explicar o que você pode encontrar no link acima: Quando me deparei com esse bug, tive que recompilar o pam_exec.so com algumas modificações no pam_exec.c. Defina o manipulador SIGCHLD como padrão antes de fork () e reconfigure-o após waitpid () e depois que fork falhe (pid == - 1 branch). Algo como:
definido:
struct sigaction newact, oldact;
newact.sa_handler = SIG_DFL;
newact.sa_flags = 0;
sigfillset(&newact.sa_mask);
sigaction (SIGCHLD, &newact, &oldact);
redefinir:
sigaction (SIGCHLD, &oldact, NULL);