LINUX.ORG.RU

Как перезапускать программу в случае ее неудачного запуска.

 ,


0

1

Имеется программа, условно назову ее stop_the_nuclear_reactor,

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
  long ltime = time(NULL);
  int stime = (unsigned)ltime/2;
  srand(stime);
  if(rand()%2) {
    while(1) {
      printf("\nАтомный реактор остановлен.");
      sleep(1);
    }
  }
  else {
    while(1) {
      printf("\nНе удалось!");
      sleep(1);
    }
  }
}
запуск удачного бесконечного цикла внутри которой, как видно непредсказуем.
Каким образом обеспечить перезапуск этой программы в случае входа в неудачный цикл?

#!/bin/sh

while true; do ./program_name; [ "$?" -eq "0" ] && break; done

вы поставили тэг bash, так что если я правильно понимаю, вам нужно решение на bash для перезапуска программы в случае неудачного завершения (код выхода $? отличный от 0)

Spoofing ★★★★★
()
Последнее исправление: Spoofing (всего исправлений: 2)

В этом вашем С нет exception-ов?

Gu4
()

А в программе сделать goto на начало не судьба?

zloy_starper ★★★
()
Ответ на: комментарий от Spoofing

Насчет кода выхода не уверен. Там же бесконечные циклы, то есть программа не завершается никогда. Наверное она должна сама себя перезапускать каким-то образом.

podovalov5
() автор топика
Ответ на: комментарий от podovalov5

вы пишите систему инициализации, ваш init всегда должен выполняться с pid = 1, а программа никогда не завершаться? нет? тогда делайте коды выхода и перезапускайте на баше.

Spoofing ★★★★★
()
Ответ на: комментарий от podovalov5

Если нет желания велосипедить как у меня, можно запускать эту утилиту из inittab'а с параметром respawn.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em
cat dowar.c

#include <nuclear_bombs.h>
#include <stdio.h>

int main(int argc, char **argv){
    int N = find_any_ready_bomb();
    if(N < 0){
        printf(stderr, "Упс, бомбы кончились");
        do_self_licvidation();
    }
    int Targ = find_nearest_not_bombed_enemy_target();
    if(Targ < 0){
        Targ = find_nearest_bombed_target();
    }
    send_bomb_to_target(N, Targ);
    return 0;
}
gcc dowar.c -o /sbin/dowar
echo "war:2345:respawn:/sbin/dowar >> /etc/inittab"
# wait for first reboot and enjoy
Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Spoofing

вы пишите систему инициализации, ваш init всегда должен выполняться с pid = 1, а программа никогда не завершаться? нет? тогда делайте коды выхода и перезапускайте на баше.

полностью согласен, но дело в том, что в реальной моей программе может какое-то время работать блок с «неудачным циклом», а условием перезапуска программы должно быть длительное повисание «неудачного цикла».
Вообще да, пожалуй, буду делать коды выхода.

podovalov5
() автор топика

Что тебе можно сказать, привязывайся к характерному поведению: к специфическому выводу, ко времени выполнения, к чему-нибудь еще

buddhist ★★★★★
()

while : ; do [ /bin/program ] && break ; done

Не проверял, должно работать.

IPR ★★★★★
()
Ответ на: комментарий от Eddy_Em

Eddy_Em, то есть мне нужно посылать сигналы SIGKILL всем процессам моей программы, когда посчитаю нужным, а благодаря строке в /etc/inittab программа запустится вновь? Правильно понял совет?

podovalov5
() автор топика

В то месте где не удалось, там делай exit с каким-то ненулевым кодом, а дальше как Spoofing написал: while true; do ./program_name; [ «$?» -eq «0» ] && break; done

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от podovalov5

посмотри сигналы.

т.е если всё желательно в один листинг си-кода то

1шаг повесить обработчики сигналов которые будут их игнорировать тогда программно если код вошёл в вечный цикл о так и будет крутиться

2шаг но так как существует(как минимум один «неустранимый» программынй прерыватель) kill -9 , то код-родитель может

METKO запускать(делится ибо после запуска сам завершается) двух потомков(через форк) которые смотрят друг на друга изредка отвлекаясь из вечного цикла и если сиблинг не виден потомок оставшийся повторяет родителя METKO

зы. задавайте ваши ответы

qulinxao ★★☆
()

а вообще исходно trap эт фишка sh как инстумента в котором доступны как консоль так и сервисы операционки.

qulinxao ★★☆
()
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
  long ltime = time(NULL);
  int stime = (unsigned)ltime/2;
  srand(stime*stime);
  if(rand()%2) {
    while(1) {
      printf("\nАтомный реактор остановлен.");
      sleep(1);
    }
  }
  else {
    while(1) {
      putchar('-');fflush(stdout);
      execv(argv[0], argv);
      sleep(1);
    }
  }
}
qulinxao ★★☆
()
Ответ на: комментарий от podovalov5

Да. Она может сама помереть, либо кто-то может ее прибить, а init заново запустит.

Eddy_Em ☆☆☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.