Если killall в цикле имеет значение, я думаю, это означает, что программа бинарного файла не завершилась должным образом, иначе killall не имел бы никакого эффекта вообще и вывел бы сообщение об ошибке (такого процесса нет или что-то вроде этот).
Поэтому я думаю, что сначала вы должны попытаться выяснить, почему процесс не завершается должным образом. Возможно, он запускает дочерний процесс, в то время как родительский процесс запускается при выходе. Если вы не можете помешать этому сделать это легко, вы можете попытаться синхронизировать свои процессы в bash-скрипте, чтобы у вас не возникало проблем со слишком многими процессами (убить их, прежде чем они смогут сделать что-то интересное, на самом деле не решить проблему).
Например, если вы скомпилируете и запустите этот скрипт, вы заметите, что вы получаете приглашение оболочки, в то время как программа по-прежнему выводит сообщения:
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
void main(void) {
pid_t parent_pid;
pid_t my_pid;
long i,j;
parent_pid= getpid();
fork();
if(getpid() == parent_pid) {
printf("I'm the parent process, Ill terminate\n");
exit(1);
} else {
printf("I'm the child process, I'll live a bit longer\n");
for(i=0;i < 100;i++) {
printf("Iteration %ld\n", i);
for(j=0;j < 500000000; j++);
}
}
}
Так что я думаю, что вам нужно синхронизировать свои процессы или убедиться, что программа завершена, прежде чем вы запустите ее в следующий раз. Кажется, для приведенного выше примера я не смог бы использовать wait (я имею в виду команду shell), но если нет другой возможности, вы могли бы поместить что-то в свой скрипт оболочки, как (хотя я знаю, что это немного неловко):
while pgrep binaryfile > /dev/null ; do
sleep 2s
done