Процесс, порожденный Daemon, умирает, когда TTY отсутствует - PullRequest
0 голосов
/ 06 февраля 2019

Мне нужно запустить обратный SSH-туннель от моей системы openwrt до моей облачной машины.Приложение в системе openwrt будет запускаться как демон при запуске. Когда оно получает определенный код по сети, оно должно запустить процесс, запускающий удаленный ssh-туннель.В системе не будет входов в систему.

Я использую следующий код для этого.

   int spawn_orphan(char* cmd)
{
    char command[1024]; // We could segfault if cmd is longer than 1000 bytes or so
    int pid;
    int Stat;
    pid = fork();
    if (pid < 0)
    {
        perror("FORK FAILED\n");
        return pid;
    }
    if (pid == 0)
    { // CHILD
        setsid(); // Make this process the session leader of a new session
        pid = fork();
        if (pid < 0)
        {
            printf("FORK FAILED\n");
            return ( 1 );
        }
        if (pid == 0)
        { // GRANDCHILD
            sprintf(command, "ash -c '%s'", cmd);
            execl("/bin/ash", "ash", "-c", command, NULL); // Only returns on error
            perror("execl failed");
            return ( 1 );
        }
        exit(0); // SUCCESS (This child is reaped below with waitpid())
    }

    // Reap the child, leaving the grandchild to be inherited by init
    waitpid(pid, &Stat, 0);
    if ( WIFEXITED(Stat) && ( WEXITSTATUS(Stat) == 0 ))
    {
        printf("dbclient exit\n");
        return 0; // Child forked and exited successfully
    }
    else
    {
        perror("failed to spawn orphan\n");
        return 1;
    }
}

Это моя вызывающая функция

uint8_t rdsService(uint8_t state)
{



    char buffer[1024];

    uint8_t retVal;
    if(state )
    {
        retVal = spawn_orphan("dbclient -f -K -I -T -N -R 1500:localhost:22 -p 22 username@HOSTMACHINE -i ~/ctusr/keys/X1_ID_RSA -y");


    }
    else
    {


        retVal = spawn_orphan("ash -c 'killall dbclient'");


    }

    return retVal;

}

Если я запускаюМое родительское приложение из консоли, приложение может порождать dbclient, и я могу сделать обратный SSH в систему.

Проблема возникает, когда я запускаю родительское приложение как Демон, в этом случае приложение порождаетdbclient, я могу видеть это, когда я делаю 'ps' на консоли, но через несколько секунд dbclient убит.

Я уже пытался запустить dbclient с помощью 'nohup'

nohup dbclient -f -K -I -T -N -R 1500: localhost: 22 -p 22 Имя пользователя @ machine-i ~ / ctusr / keys / X1_ID_RSA -y &

Работаетхорошо, когда я запускаю приложение из консоли, но при запуске приложения в качестве демона выдает ту же ошибку.

Спасибо за помощь

...