Есть ли способ запустить процессы в фоновом режиме в Windows? эквивалент nohup для windows

Ответы:

8

Вы можете использовать команду запуска для запуска процесса в фоновом режиме командного окна.

command1
command2
start command3
command4

command2 ждет, пока не завершится команда command1, но command4 не ждет, когда команда command3 завершится.

и если вам нужно работать независимо от пользователя, вошедшего в систему, вам нужно запустить процесс как службу, и вы можете использовать anysrv.exe

Арагорн
источник
Насколько я понимаю, STARTкоманда не отсоединяется, то есть она все еще является потомком процесса, который ее создал. В вашем примере это будет означать, что 'command3' умрет всякий раз, когда выходит из материнского процесса. Unix обходит это, делая это известно как «двойная вилка», но я не знаю аналога в Windows.
unixhacker2010
по крайней мере, в Windows 7 команда 3 НЕ умрет, например, вы можете войти в командную строку cmd «запустить блокнот», затем выйти, и блокнот все еще будет работать
Арагорн
Да, вы правы. Однако я тестировал из другого языка, где все, что я могу, это exec(<some windows executable>). Я ясно вижу в Process Explorer отношения между родителями и детьми, и все, что я начинаю изнутри exec(), не сохраняется. Исправьте, что это работает, если я запускаю cmd.exeиз меню «Пуск», когда запущенный процесс кажется «осиротевшим» правильно после cmd.exeвыхода Очевидно, мне нужно лучше понять это. :-(
unixhacker2010
6

Возможно, вы захотите взглянуть на службы Windows. Есть несколько инструментов, которые вы можете скачать, чтобы разместить любой процесс в качестве службы Windows. Это приводит к загрузке процесса в фоновом режиме при запуске Windows, поэтому при условии, что он не требует взаимодействия с пользователем, вы сможете разместить его таким образом.

Windows Server 2003 Resource Kit

Инструмент, который вам нужен, называется srvany.exe.

кладовая для продуктов
источник
5

Единственный способ в Windows, чтобы процесс, запущенный пользователем, продолжал выполняться после выхода из системы (то есть, что делает nohup), - это запустить его с помощью «запланированной задачи» или в качестве службы Windows. Когда пользователь выходит из системы, все процессы в сеансе входа в систему будут уничтожены.

Если вы играете, чтобы попробовать метод «Запланированные задачи», вы хотите знать, как создавать их программно. Класс Win32_ScheduledJob WMI может это сделать. Подробная документация приведена здесь: http://www.microsoft.com/technet/scriptcenter/guide/sas_man_rsxs.mspx?mfr=true. По сути, вы ищете, что делать (бессовестно украдено у Microsoft):

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

Чтобы предоставить пользователю «joe» возможность создавать запланированные задачи, вам нужно изменить разрешение в папке% SystemRoot% \ Tasks. Смотрите здесь для получения дополнительной информации по этому вопросу: http://technet.microsoft.com/en-us/library/cc785125(WS.10).aspx

Эван Андерсон
источник
В чем преимущество этого по сравнению с использованием schtasks.exe или GUI Task Scheduler?
Хелвик
Между этим API и schtasks.exe нет большой функциональной разницы. Преимущество графического интерфейса в том, что вы можете сделать это программно.
Эван Андерсон
0

Все зависит от вашей конечной цели. Вы можете запустить запланированное задание с возможностью запуска только в том случае, если пользователь вошел в режим ОТКЛЮЧЕНО. Вы могли бы использовать psexec с удаленной машины. Еще лучше, возможно, запустить процесс как службу. Посмотрите этот поиск Google , этот другой поиск Google , эту ветку и эту другую ветку для поиска возможных потенциальных клиентов в поиске решения. В конечном счете, похоже, что на машине с Windows нет точного эквивалента nohup.

Wesley
источник
Моя конечная цель - скрыть процесс от пользователя. Скройте окна, которые это порождает.
Джадер Диас