มีวิธีใดบ้างที่จะเรียกใช้กระบวนการในพื้นหลังใน Windows? nohup เทียบเท่ากับ windows


คำตอบ:


8

คุณสามารถใช้คำสั่งเริ่มต้นเพื่อเรียกใช้กระบวนการในพื้นหลังของหน้าต่างคำสั่ง

command1
command2
start command3
command4

command2 รอจนกว่า command1 เสร็จสิ้น แต่ command4 ไม่รอให้ command3 เสร็จสิ้น

และถ้าคุณต้องการที่จะทำงานโดยอิสระจากผู้ใช้ที่เข้าสู่ระบบคุณจะต้องเริ่มกระบวนการเป็นบริการและคุณสามารถใช้anysrv.exe


เท่าที่ฉันเข้าใจSTARTคำสั่งไม่ได้แยกออกเช่นมันยังคงเป็นลูกของกระบวนการที่สร้างมันขึ้นมา ในตัวอย่างของคุณมันจะหมายความว่า 'command3' จะตายเมื่อไรก็ตามที่กระบวนการแม่ออก Unix เลี่ยงสิ่งนี้โดยการทำถูกเรียกว่า 'fork-two' แต่ฉันไม่รู้ว่าเทียบเท่าใน Windows
unixhacker2010

อย่างน้อยใน Windows 7 command3 จะไม่ตายตัวอย่างเช่นคุณสามารถเข้าสู่ cmd prompt "start notepad" จากนั้น exit และ notepad จะยังคงทำงานอยู่
Aragorn

ใช่คุณพูดถูก exec(<some windows executable>)แต่ฉันถูกทดสอบจากภายในภาษาอื่นที่ทั้งหมดที่ฉันสามารถเป็น ฉันเห็นได้อย่างชัดเจนในProcess Explorerความสัมพันธ์ระหว่างพ่อแม่กับลูกและอะไรก็ตามที่ฉันเริ่มจากข้างในexec()นั้นไม่รอด แก้ไขให้ถูกต้องว่าจะใช้งานได้หากฉันเริ่มต้นcmd.exeจากเมนูเริ่มซึ่งกระบวนการเริ่มต้นดูเหมือนว่าจะถูกกำพร้า 'ถูกต้อง' เมื่อcmd.exeออกจาก เห็นได้ชัดว่าฉันต้องเข้าใจสิ่งนี้ดีกว่า :-(
unixhacker2010

6

คุณอาจต้องการดูบริการ windows มีเครื่องมือบางอย่างที่คุณสามารถดาวน์โหลดเพื่อโฮสต์กระบวนการใด ๆ เป็นบริการ windows สิ่งนี้ทำให้กระบวนการโหลดในพื้นหลังเมื่อเริ่มต้น windows ดังนั้นหากไม่จำเป็นต้องมีการโต้ตอบกับผู้ใช้คุณควรจะสามารถโฮสต์ได้เช่นนี้

ชุดทรัพยากรของ Windows Server 2003

เครื่องมือที่คุณใช้เรียกว่า srvany.exe


5

วิธีเดียวใน Windows ที่คุณสามารถเริ่มต้นกระบวนการโดยผู้ใช้ดำเนินการต่อหลังจากออกจากระบบ (เช่นที่ "nohup" ทำ) คือเริ่มโดยผ่าน "task task" หรือบริการ Windows เมื่อผู้ใช้ออกจากกระบวนการทั้งหมดในเซสชั่นการเข้าสู่ระบบของพวกเขาจะถูกฆ่า

หากคุณเป็นเกมที่จะลองใช้วิธีการ "กำหนดเวลางาน" คุณจะต้องการทราบวิธีการสร้างโดยทางโปรแกรม Win32_ScheduledJobระดับ WMI สามารถทำมันได้ เอกสารมีรายละเอียดอยู่ที่นี่: http://www.microsoft.com/technet/scriptcenter/guide/sas_man_rsxs.mspx?mfr=true โดยทั่วไปคุณกำลังมองหา (ขโมยโดยไมโครซอฟท์):

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 หรือ Task Scheduler GUI คืออะไร
Helvick

ความแตกต่างในการทำงานระหว่าง API นี้และ schtasks.exe นั้นมีไม่มากนัก ข้อดีของ GUI คือคุณสามารถทำสิ่งนี้ได้โดยทางโปรแกรม
Evan Anderson

0

ทั้งหมดนี้ขึ้นอยู่กับวัตถุประสงค์สูงสุดของคุณ คุณสามารถรันงานที่กำหนดเวลาไว้ด้วยตัวเลือกให้เรียกใช้เฉพาะเมื่อผู้ใช้เข้าสู่ระบบที่ตั้งค่าเป็นปิดการใช้งาน คุณสามารถใช้ psexec จากเครื่องระยะไกล ดีกว่ายังอาจใช้กระบวนการเป็นบริการ ตรวจสอบนี้การค้นหาของ Google , นี้การค้นหาอื่น ๆ ของ Google , หัวข้อนี้และหัวข้ออื่น ๆ นี้สำหรับโอกาสในการขายที่เป็นไปได้บางส่วนในการหาวิธีการแก้ไขการค้นหาของคุณ ในที่สุดก็ปรากฏว่าไม่มีแน่นอนเทียบเท่ากับ nohup บนเครื่อง Windows


จุดประสงค์สูงสุดของฉันคือการซ่อนกระบวนการจากผู้ใช้ ซ่อนหน้าต่างที่มันวางไข่
Jader Dias
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.