Запуск демона через rsh - PullRequest
       24

Запуск демона через rsh

4 голосов
/ 28 апреля 2010

Я хочу запустить программу как демон на удаленной машине в Unix. У меня есть rsh-соединение, и я хочу, чтобы программа работала после отключения.

Предположим, у меня есть две программы: util.cpp и forker.cpp.

util.cpp - это некая утилита, для нашей цели пусть это будет просто бесконечный корень.

util.cpp

int main() {
    while (true) {};
    return 0;
}

forker.cpp берет некоторую программу и запускает ее в отдельном процессе через fork () и execve ():

forker.cpp

#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char** argv) {
  if (argc != 2) {
    printf("./a.out <program_to_fork>\n");
    exit(1);
  }

  pid_t pid;

  if ((pid = fork()) < 0) {
    perror("fork error.");
    exit(1);
  } else if (!pid) {
    // Child.
    if (execve(argv[1], &(argv[1]), NULL) == -1) {
      perror("execve error.");
      exit(1);
    }
  } else {
    // Parent: do nothing.
  }
  return 0;
}

Если я бегу:

./forker util

forker завершается очень быстро, bash «не приостанавливается», и util работает как демон.

Но если я бегу:

scp forker remote_server://some_path/
scp program remote_server://some_path/
rsh remote_server 'cd /some_path; ./forker program'

тогда это все то же самое (т. Е. У forker remote_sever быстро заканчивается, util работает), но мой bash на локальной машине приостановлен. Он ожидает остановки утилиты (я проверял это. Если util.cpp возвращается, то это нормально.), Но я не понимаю, почему?!

Есть два вопроса:

1) Why is it paused when I run it through rsh?

Я уверен, что выбрал какой-то глупый способ запуска демона. Так

2) How to run some program as daemon in C/C++ in unix-like platforms.

Tnx!

1 Ответ

2 голосов
/ 28 апреля 2010

1) Почему он останавливается, когда я запускаю его через rsh?

Когда вы разветвляете процесс, дочерний процесс имеет свою собственную копию файловых дескрипторов родителя. Каждый из файловых дескрипторов дочернего элемента ссылается на одно и то же описание открытого файла с соответствующим файловым дескриптором родительского файла. После вызова fork() вы не закрываете стандартные потоки (stdin, stdout, stderr) в дочернем процессе до вызова execve(), поэтому они все еще подключены к rsh. Может случиться так, что rsh не вернется, пока какой-либо процесс на удаленном сервере удерживает ссылку на эти потоки. Вы можете попытаться закрыть стандартные потоки, используя fclose() перед вашим вызовом execve() или перенаправить их при выполнении вашей программы forker (т.е. ./forker program >/dev/null 2>/dev/null </dev/null).

2) Как запустить некоторую программу как демон в C / C ++ на Unix-подобных платформах.

Согласно википедии , nohup чаще всего используется для запуска команд в фоновом режиме в качестве демонов. На этом сайте также есть несколько вопросов , связанных с демоном , к которым вы можете обратиться за информацией.

Из Википедия :

nohup - это команда POSIX, которая игнорирует сигнал HUP (зависание), позволяя команде продолжать работать после выхода пользователя, который выполнил команду. Сигнал HUP (зависания) по традиции является способом, которым терминал предупреждает в зависимости от процессов выхода из системы.

Если ваша программа всегда будет работать как демон, вы можете рассмотреть возможность вызова daemon() из вашей программы. Удобная функция daemon() существует в некоторых системах UNIX.

Из справочной страницы daemon (3) :

Функция daemon () предназначена для программ, желающих отключиться от управляющего терминала и работать в фоновом режиме в качестве системных демонов.

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


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

rsh remote_server 'cd /some_path; nohup ./forker program >program.out 2>program.err </dev/null &'

...