Czy jest jakiś sposób na uruchomienie procesów w tle w systemie Windows? odpowiednik nohup dla systemu Windows

Odpowiedzi:

8

Możesz użyć polecenia start, aby uruchomić proces w tle okna poleceń.

command1
command2
start command3
command4

polecenie 2 czeka do zakończenia polecenia 1, ale polecenie 4 nie czeka, aż polecenie 3 zakończy się.

a jeśli chcesz uruchomić niezależnie od zalogowanego użytkownika, musisz rozpocząć proces jako usługa i możesz użyć anysrv.exe

Aragorn
źródło
O ile rozumiem, STARTpolecenie nie wykonuje odłączenia, tzn. Nadal jest potomkiem procesu, który go utworzył. W twoim przykładzie będzie to oznaczać, że „polecenie3” umrze, gdy proces macierzysty zakończy działanie. Uniks ten obchodzi to, co nazywane jest „rozwidleniem dwa razy”, ale nie znam odpowiednika w systemie Windows.
unixhacker2010
przynajmniej w Windows 7 polecenie3 NIE umrze, na przykład możesz dostać się do polecenia cmd „uruchom notatnik”, a następnie wyjdź i notatnik będzie nadal działał
Aragorn
Tak, masz rację. Jednak testowałem z innego języka, w którym wszystko, co mogę exec(<some windows executable>). W Eksploratorze procesów wyraźnie widzę relacje rodzic-dziecko i wszystko, co zacznę od wewnątrz exec(), nie przetrwa. Prawidłowe, że wydaje się działać, jeśli uruchomię cmd.exez menu Start, w którym rozpoczęty proces wydaje się osierocony „poprawnie” po cmd.exewyjściu. Oczywiście muszę to lepiej zrozumieć. :-(
unixhacker2010
6

Możesz spojrzeć na usługi systemu Windows. Istnieje kilka narzędzi, które można pobrać w celu obsługi dowolnego procesu jako usługi Windows. Powoduje to, że proces ładuje się w tle podczas uruchamiania systemu Windows, więc pod warunkiem, że nie wymaga interakcji użytkownika, powinieneś być w stanie obsługiwać go w ten sposób.

Zestaw Windows Server 2003 Resource Kit

Narzędzie, którego szukasz, nazywa się srvany.exe.

Spence
źródło
5

Jedynym sposobem w systemie Windows, w którym użytkownik może uruchomić proces po zakończeniu wylogowania (tzn. Co robi „nohup”), jest uruchomienie go poprzez „zaplanowane zadanie” lub jako usługę Windows. Gdy użytkownik wyloguje się, wszystkie procesy w sesji logowania zostaną zabite.

Jeśli chcesz wypróbować metodę „Zaplanowane zadania”, powinieneś wiedzieć, jak je programować. Win32_ScheduledJob klasy WMI może to zrobić. Szczegółowa dokumentacja znajduje się tutaj: http://www.microsoft.com/technet/scriptcenter/guide/sas_man_rsxs.mspx?mfr=true Zasadniczo chcesz to zrobić (bezwstydnie skradzione Microsoftowi):

Set objService = GetObject("winmgmts:\\.")
Set objNewJob = objService.Get("Win32_ScheduledJob")
errJobCreated = objNewJob.Create("Program-to-execute.exe", "ugly-formatted-time-string-per-Microsoft-docs",True ,1 OR 4 OR 16, , ,JobID)
If Err.Number = 0 Then
 Wscript.Echo "New Job ID: " & JobID
Else
 Wscript.Echo "An error occurred: " & errJobCreated
End If

Aby przyznać „użytkownikowi Joe” możliwość tworzenia zaplanowanych zadań, musisz zmodyfikować uprawnienia do folderu% SystemRoot% \ Tasks. Zobacz tutaj informacje o tym froncie: http://technet.microsoft.com/en-us/library/cc785125(WS.10).aspx

Evan Anderson
źródło
Jaka jest zaleta robienia tego przy użyciu schtasks.exe lub GUI Harmonogramu zadań?
Helvick
Nie ma dużej różnicy funkcjonalnej między tym API a schtasks.exe. Zaletą GUI jest to, że możesz to zrobić programowo.
Evan Anderson
0

Wszystko zależy od tego, jaki jest twój ostateczny cel. Można uruchomić zaplanowane zadanie z opcją uruchomienia tylko wtedy, gdy użytkownik jest zalogowany i ustawiony na WYŁĄCZONY. Możesz użyć psexec ze zdalnego komputera. Jeszcze lepiej może być uruchomienie procesu jako usługi. Sprawdź tę wyszukiwarkę Google , tę inną wyszukiwarkę Google , ten wątek i ten inny wątek, aby poznać potencjalne potencjalne szanse na znalezienie rozwiązania. Ostatecznie wydaje się, że nie ma dokładnego odpowiednika nohup na komputerze z systemem Windows.

Wesley
źródło
Moim ostatecznym celem jest ukrycie procesu przed użytkownikiem. Ukryj okna, które się odradza.
Jader Dias,