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?
Odpowiedz
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)
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
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
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
można użyć ekran polecenia. here is a tutorial. Uwaga: być może trzeba będzie zainstalować go w swoich systemach.
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.
Jak uruchomić program za pomocą nohup? Czy ma to jakieś negatywne implikacje dla interakcji z programem w powłoce? Dziękuję – user1166981
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
Och, ale twój program jest interaktywny. W takim przypadku potrzebujesz ekranu. – Joni
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.
Niestety, nie będziesz w stanie wchodzić w interakcje z programem. – BRFennPocock
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
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 ...
Szczerze mówiąc, chciałbym wdrożyć rozwiązanie z C zamiast polegać na istniejących programach na pudełku. – user1166981
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...
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
Lepszym rozwiązaniem może być wywołanie funkcji 'daemon'. –
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
- 1. Program końcowy po zamknięciu MessageBox
- 2. Po zamknięciu terminalu bez zamykania komunikatu "Połączenie odrzucone". Django 1.8
- 3. Czy można uruchomić wiersz terminala/wiersza polecenia w Rubymine?
- 4. Czy można utrzymywać sesję nawet po zamknięciu przeglądarki?
- 5. Czy skuteczne C++ nadal działa?
- 6. Python: czy wątek nadal działa
- 7. Sprawdź, czy skrypt php nadal działa.
- 8. Czy "elseif" nadal istnieje?
- 9. Wystąpił wyjątek, ale program nadal działa.
- 10. Czy uruchomić program py2exe exe bez konsoli?
- 11. Czy można stylować program ProgressIndicator?
- 12. Czy można dokować program Internet Explorer?
- 13. Czy mogę automatycznie uruchomić polecenie terminalu podczas otwierania projektu PHPStorm?
- 14. Czy można ustawić program MasterType?
- 15. Czy można programować program UIContainerView?
- 16. ActionController :: LIve Czy można sprawdzić, czy połączenie jest nadal aktywne?
- 17. Czy można uruchomić zadanie SSIS z .net?
- 18. Czy można przyspieszyć program WordMat Lemmatizer?
- 19. Dlaczego połączenie SFTP nadal istnieje po zamknięciu kanału JSCH?
- 20. Wix: Czy można ręcznie uruchomić element RemoveFolderEx z niestandardowej akcji?
- 21. Jak mogę uruchomić Symulator iOS z Terminala?
- 22. Jak uruchomić kod Ruby z terminala?
- 23. Czy edytor układu można wyodrębnić z zaćmienia i uruchomić samodzielnie?
- 24. Czy Android AlarmManagers nadal działają po aktualizacji aplikacji?
- 25. Jak uruchomić mój plik php z terminalu Mac
- 26. Zapobieganie zamknięciu aplikacji po zamknięciu konsoli
- 27. Nie można uruchomić program C przez cmd
- 28. Błąd podczas uruchamiania apache z terminala po usunięciu MAMP
- 29. Jak uruchomić program Perla krok po kroku?
- 30. Jak sprawdzić, czy skrypt Perl działa w terminalu?
Dlaczego "w C"? Dlaczego rozwiązanie w Perlu nie jest dobre? ?? – pmg
Miałem nadzieję zachować cały kod w samym programie, który jest kodowany w C. – user1166981