Witam, chciałbym z poziomu PHP uruchomić skrypt .bat oraz uzyskać PID procesu, aby mieć możliwość późniejszego zamknięcia tego programu.
Czytałem o exec ale w manualu nie ma nic o PID, a do tego wszystkie przykłady w internecie są pod linuxa
- Rejestracja:ponad 13 lat
- Ostatnio:około 13 lat
- Postów:19

- Rejestracja:prawie 23 lata
- Ostatnio:około 3 godziny
Skomplikowane dość, ale wykonalne.
exec() powoduje, że PHP wisi oczekując na zakończenie aplikacji. Aby uruchomić w tle możesz użyć w Linuksie &, a w Windows np. start.exe
.
Potem możesz użyć np. tasklist.exe do uzyskania listy aktualnych procesów i ich PID (między innymi) - tasklist jest dostępny bodaj od Windows XP SP2, więc już dawno. Na tym, co zwraca tasklist szukasz PID przypisanego do cmd.exe (bo to interpreter plików BAT).
Zamknięcie na podstawie PID może załatwić aplikacja taskkill: taskkill.exe /PID 1234
.
- Rejestracja:ponad 13 lat
- Ostatnio:około 13 lat
- Postów:19
jest tu jeszcze jeden problem, może się zdarzyc tak że będą działać 3 takie same programy jednak z innymi parametrami.
o ile w linuxie samo exec zwraca pid, to w windowsie przeszukiwanie tasklist - ale skoro działają 2 inne to jak moge znaleźć ten 3. dodam że nie jest to jedna strona ktora nimi zarzadza

- Rejestracja:prawie 23 lata
- Ostatnio:około 3 godziny
Pomysł na szybko:
start.exe pozwala na sprecyzowanie nazwy okna, z którym będzie wywoływana aplikacja, np. start.exe foobar cmd.exe
. Z kolei tasklist pozwala filtrować po nazwie okna, np. tasklist.exe /FI "WINDOWTITLE eq foobar"
. Uruchamiaj każdy z losowym identyfikatorem jako nazwą okna, a znajdziesz PID tego, o który chodzi.
Pomysł nieco na około, ale chyba lepszy:
Użyj psexec z pakietu PsTools z Sysinternals. Potrafi zwrócić PID utworzonego procesu (co prawda w formie tekstowej, ale da się sparsować) i od razu kończyć swoje działanie.
C:\Users\Marcin>psexec -d cmd.exe
PsExec v1.98 - Execute processes remotely
Copyright (C) 2001-2010 Mark Russinovich
Sysinternals - www.sysinternals.com
cmd.exe started with process ID 5376.
C:\Users\Marcin>
http://forum.sysinternals.com/psexec-pids-php-and-hidden-windows_topic12108.html
- Rejestracja:ponad 13 lat
- Ostatnio:około 13 lat
- Postów:19
Pojawił się następny problem..
$command = "cd \"C:\\Program Files (x86)\\LucasArts\\Star Wars Jedi Knight Jedi Academy\\GameData\"";
$command .= "\r\n";
$command .= "\"C:\\Program Files (x86)\\LucasArts\\Star Wars Jedi Knight Jedi Academy\\GameData\\PsExec.exe\" -d \"C:\\Program Files (x86)\\LucasArts\\Star Wars Jedi Knight Jedi Academy\\GameData\\serverstart.bat\"";
No cóż, chciałbym aby najpierw użyć CD a następnie od razu dalszą cześć uruchamiającą serwer.
Niestety znaki \r\n nie są obsługiwane przez cmd

- Rejestracja:ponad 17 lat
- Ostatnio:11 miesięcy
Jak to nie są? Są! Tylko to nie jest konsola :|
Obstawiam, że nie istnieje nawet w tym kontekście polecenie 'cd'.
Zmień bieżący katalog w ten sposób: http://www.php.net/manual/pl/function.chdir.php
Później wykonaj po prostu "serverstart.bat".
Z drugiej strony przekombinowałeś - po cholerę w ogóle robić cd
lub chdir
skoro używasz ścieżek absolutnych?
- Rejestracja:ponad 13 lat
- Ostatnio:około 13 lat
- Postów:19
Gdyż taki jest początek bata: .\jampded +set BLAH BLAH
Gdy nie ma najpierw CD, program za ścieżkę z której wszystko wykonuje uznaje: C:/windows/administartor
, a ja chcę aby to bylo: C:\Program Files (x86)\LucasArts\Star Wars Jedi Knight Jedi Academy\GameData

- Rejestracja:prawie 23 lata
- Ostatnio:około 3 godziny
Funkcja exec() nie zwraca całego wyjścia konsoli. Manual do PHP mówi:
Return Values
The last line from the result of the command. If you need to execute a command and have all the data from the command passed directly back without any interference, use the passthru() function.To get the output of the executed command, be sure to set and use the output parameter.
Użyj trzeciego parametru dla exec, wyjście zostanie zapisane do tablicy wyjściowej (użyj referencji!).
I fakt, EULA wyskakuje przy pierwszym uruchomieniu, ale kompletnie na to bym nie wpadł ;-)

- Rejestracja:około 14 lat
- Ostatnio:ponad 9 lat
bo uruchamiając skrypt odpalasz cmd a on dopiero uruchamia podprogramy
ale jak zabijesz te cmd to najprawdopodobniej pójdzie spać razem ze swoimi dziećmi więc nie powinno ci to przeszkadzać
inna sprawa - czemu uruchamiasz skrypt bat a nie przepiszesz go na php?

- Rejestracja:około 14 lat
- Ostatnio:ponad 9 lat
carkar napisał(a)
Zabicie cmd, nie powoduje zabicia konsoli jampded.exe
Nie przepisze, gdyż w bacie są 2 linijki(jedna z tych poleceń to CD)
no to skoro są tylko 2 linijki to tym prościej przepisać je na php - nie rozumiem Twojego podejścia :/
odpowiednik cd
w php to chdir()
albo jeszcze lepiej - cd
możesz zastąpić przełącznikiem -w
w psexec
żeby zabić cmd z potomkami użyj przełącznika /T w taskkill
.bat
sam w sobie nie jest programem, to po co w ogóle musisz taki plik uruchamiać? \o/