.bat arquivo para executar e parar um processo em segundo plano no Windows

3

Eu quero agrupar dois arquivos simples do Windows com o meu aplicativo PHP que pode iniciar e parar um servidor da Web integrado ao PHP para testar o aplicativo no host local.

Isso é o que eu tenho em winlaunch.bat até agora:

php.exe -S 127.0.0.1:80 -t path/to/my/app/webroot my_app_bootstrap_script.php

Coisas que não sei fazer:

  • Como redireciono a saída para um arquivo de log?
  • Como faço para fechar automaticamente a janela de comando se invocada a partir das janelas? explorador, mantendo o aplicativo em execução?
  • O que eu coloco no script de parada?
  • Como posso verificar se o aplicativo já está em execução?
por NotGaeL 25.07.2015 / 13:17

1 resposta

4

O caractere de redirecionamento no Microsoft Windows, assim como em outros sistemas operacionais, como Linux, OS X, etc., é ">". Então você pode redirecionar a saída da seguinte forma:

php.exe -S 127.0.0.1:80 -t path/to/my/app/webroot my_app_bootstrap_script.php > "C:\somedir\php.log"

Modifique o caminho do diretório e o nome do arquivo para o que quiser. Você não precisa de aspas duplas em torno dessa informação, a menos que tenha um espaço no caminho do diretório ou no nome do arquivo, mas você faz isso se houver um espaço e não faz mal incluí-los nos dois casos.

Nota: quando você usa o ">" Se algum arquivo já existir com o local e nome que você especificou, esse arquivo será sobrescrito. Se, em vez disso, você quiser que o arquivo de registro continue crescendo, ou seja, deseja anexar a um arquivo existente na próxima vez que iniciar o php.exe, use >> , em vez de > . Isso resultará na criação do arquivo se ele não existir, mas a saída será anexada a um arquivo existente.

Você pode usar o comando taskkill para finalizar um processo. Por exemplo, você pode usar:

taskkill /f /fi "imagename eq php.exe"

O /f pode não ser necessário, mas com essa opção você pode ter os processos de força do comando taskkill para fechar, que podem não fechar de outra forma. O /fi filtra a saída do comando taskkill. Nesse caso, você estaria filtrando para ver somente os processos denominados php.exe. Se o processo não estiver em execução, você verá o seguinte se emitir o comando:

C:\>taskkill /fi "imagename eq php.exe"

INFO: No tasks running with the specified criteria.

Você pode verificar se o php.exe já está em execução usando o comando tasklist:

tasklist /fi "imagename eq php.exe"

Isso mostrará todas as instâncias de um processo chamado php.exe em execução. Em alguns casos, você pode ter vários processos com o mesmo nome, por exemplo, chrome.exe. Em outros casos, como o explorer.exe, você deve ver apenas um e verá algo como o seguinte:

C:\>tasklist /fi "imagename eq explorer.exe"

Image Name                     PID Session Name        Session#    Mem Usage
========================= ======== ================ =========== ============
explorer.exe                 91484 Console                    1     37,424 K

Você também pode verificar se está executando "canalizando" a saída do comando tasklist para o comando find com o "|" personagem de cachimbo. Por exemplo:

C:\>tasklist /fi "imagename eq explorer.exe" | find /i /c "explorer.exe"
1

O /i instrui a localização para ignorar o caso de letras, por exemplo, letras maiúsculas e minúsculas não importam. Provavelmente não é necessário, neste caso, se o processo será sempre chamado "php.exe", mas eu mencionei isso no caso de você poder usar find "Php.exe" quando o processo é chamado "php.exe". O /c informa ao encontrar apenas para contar o número de ocorrências da string que você disse para procurar.

Se o resultado for "1", ou maior, se o processo puder ser executado mais de uma vez, ele estará em execução. Se for "0", não está em execução. No seu caso, a resposta provavelmente será sempre 0 ou 1 e você mudaria "explorer.exe" para "php.exe". Se você quisesse testar o resultado e emitir o comando taskkill se o valor não for zero ou você poderia simplesmente emitir o comando taskkill sempre que quiser parar o processo, se ele estiver em execução. Se não estiver em execução, o comando taskkill apenas reportará "INFO: Nenhuma tarefa sendo executada com os critérios especificados".

Se você não quer que a janela permaneça aberta, você pode usar o comando "start" no seu arquivo de lote. Por exemplo,

start "PHP" "php.exe -S 127.0.0.1:80 -t path/to/my/app/webroot my_app_bootstrap_script.php"

O "PHP" após o comando está fornecendo um título para a janela. Você pode emitir o comando start /? em um prompt de comando para ver as opções do comando start.

    
por 25.07.2015 / 14:42