2012-01-27 11 views
5

Napisałem program, który uruchamiam po podłączeniu do skrzynki przez SSH. Ma pewne interakcje użytkownika, takie jak wybieranie opcji po wyświetleniu monitu i zwykle czekam, aż zakończą się procesy, zanim się wyloguję, co zamyka terminal i kończy program. Ale teraz proces jest dość długi i nie chcę czekać podczas logowania, więc jak mogę wdrożyć obejście tego w C?Czy można uruchomić program z terminala i czy nadal działa po zamknięciu terminalu?

+0

Dlaczego "w C"? Dlaczego rozwiązanie w Perlu nie jest dobre? ?? – pmg

+0

Miałem nadzieję zachować cały kod w samym programie, który jest kodowany w C. – user1166981

Odpowiedz

7

Można uruchomić program w tle, wykonując polecenia z "&"

wget -m www.google.com &

Lub można użyć "ekran" Program, który pozwala na przymocowanie-deattach sesje

wget ekran -m www.google.com

(Ctrl + D)

screen -r (do ponownego ATTACH)

http://linux.die.net/man/1/screen

+0

Więc gdybym miał uruchomić program jak ./program i mógłbym nadal wchodzić w interakcję z programem jak zwykle, ale kiedy zamykam czy jego terminal nadal działa w tle, nawet po wylogowaniu? – user1166981

+3

Nie, jeśli uruchomisz program z "&" zostanie on trafiony w tle, ale nadal będzie wysyłany do terminala - jednak nie będziesz mógł z nim współdziałać. Będzie działać po zamknięciu terminalu. Jeśli chodzi o to, co opisujesz, zdecydowanie sugerowałbym użycie "ekranu" - jest fantastycznie użyteczny. – Seidr

+0

Więc masz na myśli, że nie może on pobierać danych od użytkownika, ale możesz go zgłosić na przykład, co robi? – user1166981

2

Proces jest wysyłany z sygnałem HUP po wyjściu powłoki. Wszystko, co musisz zrobić, to zainstalować procedurę obsługi sygnału, która ignoruje SIGHUP.

Lub po prostu uruchom program używając nohup.

+0

Jak uruchomić program za pomocą nohup? Czy ma to jakieś negatywne implikacje dla interakcji z programem w powłoce? Dziękuję – user1166981

+0

Składnia byłaby "argumentami polecenia nohup &". Konsekwencje obejmują zapis programu do pliku nohup.out - bez przekierowania go do innego pliku - a stdin nie jest podłączony do terminalu. – Joni

+1

Och, ale twój program jest interaktywny. W takim przypadku potrzebujesz ekranu. – Joni

1

Tradycyjny sposób to zrobić przy użyciu nohup (1) komenda:

nohup mycmd </dev/null>& output.log & 

Oczywiście jeśli nie dbają o wyjściu można wysłać go do/dev/null też, albo może pobrać dane z pliku, jeśli chcesz.

Wykonanie tego w ten sposób ochroni proces przed SIGHUP, który normalnie spowoduje jego zakończenie. Będziesz także chciał przekierować stdin/stdout/stderr jak wyżej, ponieważ zakończysz sesję ssh.

Składnia przedstawiona powyżej dotyczy basha.

+0

Niestety, nie będziesz w stanie wchodzić w interakcje z programem. – BRFennPocock

+0

To prawda - początkowo opuściłem tę część pytania. Jeśli jednak interakcja zachodzi w przewidywalny sposób, dane wejściowe użytkownika mogą zostać umieszczone w pliku, a plik zostanie przekierowany na standardowe wejście. – FatalError

0

Istnieje wiele opcji :-) TIMTOWTDI ... Jednak dla twoich potrzeb możesz sprawdzić działanie narzędzia wiersza polecenia, takiego jak dtach lub GNU screen.

Jeśli rzeczywiście chcą wprowadzić coś w C, można wymyślać, że koło, ale z opisem problemu, wątpię powinno być konieczne ...

+0

Szczerze mówiąc, chciałbym wdrożyć rozwiązanie z C zamiast polegać na istniejących programach na pudełku. – user1166981

0

Rzeczywisty kod C na tle procesu trywialny:

//do interactive stuff... 
if(fork()) 
    exit(0); 
//cool, I've been daemonized. 

Jeśli znasz kod nigdy nie skończyć na maszynie non-linux-lub-BSD, można nawet użyć daemon()

//interactive... 
daemon(0, 0); 
//background... 
+0

Czy to naprawdę jest proste? Mogę to mieć na końcu mojego programu i mogę wyjść z terminalu, podczas gdy on nadal wykonuje procesy w tle (bez dalszego drukowania danych wyjściowych/wejściowych)? – user1166981

+0

Lepszym rozwiązaniem może być wywołanie funkcji 'daemon'. –

+0

Rzeczywiście. Możesz go nawet przetestować: 'main() {int k = getchar(); printf ("% c \ n", k); if (fork()) exit (0); pauza(); } 'następnie zamknij terminal i' ps ax | grep a.out'. To będzie jasne jak dzień. – Dave

Powiązane problemy