uruchamianie .bat pod windowsem

0

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

0

Ostatecznie mogę skopiować zawartość pliku bat, jednak jak to uruchomić bez czekania na koniec działania aplikacji + uzyskać PID

2

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.

0

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

1

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

0

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

1

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?

0

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

1

Dorzuć na pocżatek bata:
cd C:\\Program Files (x86)\\LucasArts\\Star Wars Jedi Knight Jedi Academy\\GameData\\
I będziesz miał pewność, że katalog roboczy będzie w porządku.

0

No cóż gdy wpisuje w konsoli to co mam w skrypcie, wszystko działa dobrze.
A gdy z PHP: Fatal error: Maximum execution time of 30 seconds exceeded in C:\wamp\www\RotFpanel\test.php on line 4
W linii 4 jest własnie EXEC polecenia

0

Bo nie robisz tego asynchronicznie.

0

Wystarczyło dodać /accepteula do linii poleceń PsExec-a,
echo(exec($command));
nie wyświetla żadnego wyniku :/, pomimo że na serwerze wszystko wykonuje się poprawnie

1

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ł ;-)

0

Dodałem:

-i  2>&1'

Ale to zwraca mi PID CMD.exe a nie jampded.exe

1

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?

0

Zabicie cmd, nie powoduje zabicia konsoli jampded.exe
Nie przepisze, gdyż w bacie są 2 linijki(jedna z tych poleceń to CD)

1
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

0

Dzięki wielkie wszystkim ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1