Você precisará se livrar do shell intermediário e iniciá-lo como seu filho direto, provavelmente com algo como proc_open (não sou especialista em PHP). Então você receberá um SIGCHLD quando o filho terminar. Você pode instalar um manipulador de sinal para ele ( pcntl_signal mais provável) e nele não bloquear ( WNOHANG ) esperar ( pcntl_waitpid ) no PID do seu filho e se a espera for bem sucedida, registre a hora e remova o manipulador de sinal.
file_exists("/proc/{$pid}") não é confiável se você não controlar as chamadas wait (se pid não for seu filho) porque os PIDs são reciclados.