Windows'da arka planda işlemleri çalıştırmanın herhangi bir yolu var mı? Windows için nohup eşdeğeri


Yanıtlar:


8

Komut penceresinin arka planında bir işlemi çalıştırmak için start komutunu kullanabilirsiniz.

command1
command2
start command3
command4

command2, command1 bitene kadar bekler, ancak command4, command3'ün bitmesini beklemez.

ve oturum açmış olan kullanıcıdan bağımsız olarak çalıştırmanız gerekirse, işlemi bir hizmet olarak başlatmanız gerekir ve anysrv.exe'yi kullanabilirsiniz .


Anladığım kadarıyla, STARTkomut bir ayırma yapmaz, yani onu hala yaratan sürecin bir çocuğudur. Örneğinizde bu, ana süreç her çıktığında 'command3'ün öleceği anlamına gelir. Unix bunu yaparak atlatıyor 'çatal-iki kez' olarak biliniyordu ama Windows'da bir eşdeğer bilmiyorum.
unixhacker2010

en azından Windows 7'de command3 ölmeyecek, örneğin u bir cmd istemi "başlangıç ​​not defteri" içine alabilirsiniz ve sonra çıkın ve not defteri hala çalışıyor olacak
Aragorn

Evet, haklısın. Ancak test edebileceğim başka bir dilde test yapıyordum exec(<some windows executable>). Process Explorer'da ebeveyn-çocuk ilişkisini açıkça görebiliyorum ve içinden ne exec()başlasam hayatta kalmıyor. Bir cmd.exebaşlat menüsü başlatılırsa, başlatıldığında başlatılan işlemin 'doğru' yetim göründüğü durumlarda işe yarayacak şekilde düzeltin cmd.exe. Açıkçası bunu daha iyi anlamam gerekiyor. :-(
unixhacker2010

6

Windows hizmetlerine bakmak isteyebilirsiniz. Windows hizmeti olarak herhangi bir işlemi barındırmak için indirebileceğiniz bazı araçlar vardır. Bu, işlemin Windows başlangıcında arka planda yüklenmesine neden olur, bu nedenle kullanıcı etkileşimi gerektirmiyorsa, bu şekilde barındırmanız gerekir.

Windows Server 2003 Kaynak Seti

Takip ettiğiniz araca srvany.exe denir.


5

Windows'da, bir kullanıcı tarafından oturum açtıktan sonra çalışmaya devam edebilmenin tek yolu (yani "nohup" ın yaptığı) ya "zamanlanmış görev" ya da Windows hizmeti olarak başlatmaktır. Kullanıcı oturumu kapattığında oturum açma oturumundaki tüm işlemler öldürülür.

"Zamanlanmış Görevler" yöntemini denemek için oyun oynuyorsanız, bunları programlı olarak nasıl oluşturacağınızı bilmek istersiniz. Win32_ScheduledJob WMI sınıfı yapabilirsiniz. Belgeler burada ayrıntılı olarak verilmiştir: http://www.microsoft.com/technet/scriptcenter/guide/sas_man_rsxs.mspx?mfr=true Temel olarak (Microsoft'tan utanmadan çalınan):

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 kullanıcısına" zamanlanmış görevler oluşturma yeteneği vermek için,% SystemRoot% \ Tasks klasöründeki izni değiştirmeniz gerekir. Bu cephedeki bazı bilgiler için buraya bakın: http://technet.microsoft.com/en-us/library/cc785125(WS.10).aspx


Bunu schtasks.exe veya Görev Zamanlayıcı GUI'sini kullanarak yapmanın avantajı nedir?
Helvick

Bu API ve schtasks.exe arasında işlevsel bir fark yoktur. GUI'nin avantajı bunu programlı olarak yapabilmenizdir.
Evan Anderson

0

Bu, nihai amacınızın ne olduğuna bağlıdır. Zamanlanmış bir görevi yalnızca kullanıcı oturum açmış durumda DEVRE DIŞI olarak ayarlanmışsa çalıştırma seçeneğiyle çalıştırabilirsiniz. Uzak bir makineden psexec kullanabilirsiniz. Daha da iyisi, süreci bir hizmet olarak çalıştırmak olabilir. Check out bu, Google aramayı , bu diğer Google araması , Konuyu ve bu diğer iplik bir çözüm için arama bazı olası potansiyel müşteri için. Nihayetinde , bir Windows makinesinde nohup'a tam eşdeğer olmadığı anlaşılıyor.


Nihai amacım işlemi kullanıcıdan gizlemek. Ortaya çıktığı pencereleri gizleyin.
Jader Dias
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.