#include <unistd.h>
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <ctype.h>
 #include <fcntl.h>
 #include <string.h>
 #include <linux/string.h>
 
 int check_if_command_finished(struct child_process *cmd)
 {
+#ifdef __linux__
+       char filename[FILENAME_MAX + 12];
+       char status_line[256];
+       FILE *status_file;
+
+       /*
+        * Check by reading /proc/<pid>/status as calling waitpid causes
+        * stdout/stderr to be closed and data lost.
+        */
+       sprintf(filename, "/proc/%d/status", cmd->pid);
+       status_file = fopen(filename, "r");
+       if (status_file == NULL) {
+               /* Open failed assume finish_command was called. */
+               return true;
+       }
+       while (fgets(status_line, sizeof(status_line), status_file) != NULL) {
+               char *p;
+
+               if (strncmp(status_line, "State:", 6))
+                       continue;
+
+               fclose(status_file);
+               p = status_line + 6;
+               while (isspace(*p))
+                       p++;
+               return *p == 'Z' ? 1 : 0;
+       }
+       /* Read failed assume finish_command was called. */
+       fclose(status_file);
+       return 1;
+#else
        wait_or_whine(cmd, /*block=*/false);
        return cmd->finished;
+#endif
 }
 
 int finish_command(struct child_process *cmd)