Killing a java process safely on windows - batch-file

i want to kill a java process through a batch file, but safely.
The problem is, when i use
taskkill /IM java.exe
it wont kill the process because java doesn't allow it.
When i use
taskkill /F /IM java.exe
it works, but there is the risk that files could corrupt, so i don't want to use it.
The subject is to stop a minecraft server which is running on windows. One option on linux is to use screen so i can send a stop-command to this virtual command line but as i know this programm doesn't work on windows. Is there mayby an alternative?

Related

Windows Batch file to run in background and kill any non responsive program automatically

I am using an application which keeps hanging and makes my computer non responsive, at this point i won't be able to open task manager or do anything else. I have to hard reboot my system.
I came across some batch command which can kill non responsive programs.
taskkill /f /fi "status eq not responding"
I am aware of how to create a batch file.
Can anyone suggest how to always run this batch command in background and hunt those programs which are not responding?
Any help is appreciated.
Batch programs were never designed run in the background in windows. They always simply execute through once.
What I have done for this type of scenario is setup a windows scheduled task to run every X minutes where X is an appropriate interval to check for the process in your environment.
Hope that helps!
You can create a Scheduled Task to run periodically in Windows. Lookup Windows Task Scheduler.
Another way is to launch this batch file and run this command in an infinite loop. Ex
:start
taskkill /f /fi "status eq not responding"
sleep 600
goto start
this will run the command every 10 minutes.

Batch file to start browser minimized and kill it after

Trying to create a batch file that will open a specific browser (firefox) minimized and direct it to a link. After A specific period 5 seconds the browser will close. I can direct to the link open a specific browser but the browser does not start minimized nor does it close after 5.
#echo off
SET BROWSER=firefox.exe
SET WAIT_TIME=2
start /min %BROWSER% http://www.stackoverflow.com
SET WAIT_TIME=2
taskkill /IM firefox.exe
Your batch file cannot close the process because, while it sets a variable called WAIT_TIME, the batch file does not actually wait; the taskkill command runs immediately, before the process has even started. You need to add a command such as timeout to actually make the batch file wait.
SET WAIT_TIME=2
timeout %WAIT_TIME%
taskkill /im firefox.exe
For the minimized window, there is no good solution. A Windows (non-console) program receives the /min param through its nCmdShow parameter to WinMain(), but it's up to the program what to do with that. Most simply ignore it. There are 3rd-party solutions which will send a minimize command to the window after it has opened, but there's no easy way to do this in Windows Batch without involving another scripting language like VBS or PowerShell.

Why GUI application blocks a batch file?

There are many references on Internet claiming that one of differences between a GUI and a console application is that running the GUI application from a batch file does not block its execution, while running the console application does block it.
Few of many references, these are particularly from SO/SE:
How can I get an MFC application to block from the command line?
How to wait for a process to terminate to execute another process in batch file
How do you wait for an exe to complete in batch file?
Run a program in a batch script and wait for it to finish before continuing
Moreover, I myself remember this is/was true.
Yet it does not seem to work this way.
I've tested this on a simple batch file like:
echo Pre
notepad
echo Post
The Post is not printed until I close notepad. Why, when a notepad is clearly a GUI application?
I've tested this on Windows 8, 7, and XP just to rule out a possibility that the behavior has changed in recent versions of Windows. I've tried to disable command extensions as one of possible culprits too.
It has to do with how the application that you launch runs and terminates. Some programs launch another process and then terminate, others continue to run. Calc.exe and Notepad.exe simply run until you close them. Write.exe and any program that launches as a result of a file association (e.g., bitmap, wave file, control panel applet, etc.), actually launch another program and then the process that launched them terminates returning control back to the batch file so it can execute the next line.
Here are some examples:
#echo off
echo Starting Calc.exe
calc.exe
echo Calc was closed by the user
echo Starting Notepad.exe
Notepad.exe
echo Notepad was closed by the user
echo Starting WordPad.exe
write.exe
echo Write launched WordPad and then terminated allowing the batchfile to continue
echo Starting Services.msc
services.msc
echo Windows launched MMC, opened services.msc, then returned control to the batchfile
echo Launching WMP via Chord.wav
c:\windows\media\chord.wav
echo Windows launched WMP, opened Chord.wav, then returned control to the batchfile
The CMD process knows Calc and Notepad are still running because it spawned them itself. The CMD process does not know that the others are still running because the intermediate process terminated.
To observe this, open Process Explorer and view the processes displayed in the hierarchical tree. Calc.exe and Notepad.exe both remain as child processes of the CMD process that ran the batchfile. Write.exe and MMC.exe (services.msc) both become top-level processes, no longer children to the CMD process. WMPlayer.exe remains a child process to svchost.exe, which is how Windows launched it. The CMD process doesn't know they are still running because it didn't launch them, some other Windows process did. So execution continues...
One more example of this is how MSPaint.exe functions. If you run it by using the Windows built-in file association for BMPs, then Windows launches MSPaint.exe and control is immediately returned to the batchfile. However, if you pass the BMP to MSPaint.exe, then the batchfile waits for you to close MSPaint before continuing. (I'm on a dev machine with no BMPs, so create a simple one called C:\MyBitmap.bmp.)
#echo off
C:\MyBitmap.bmp
calc.exe
mspaint.exe C:\MyBitmap.bmp
notepad.exe
Calc.exe will open immediately, Notepad.exe will not open until you close the second instance of MSPaint.exe.
I know you didn't ask about launching Windows processes via their file association, but it just demonstrates how the owning process can change. If the CMD process owns the launched process, it should wait until it terminates to continue execution. If the spawned process hands control off to another process, then the CMD process doesn't know about the grandchild process and it continues on with its execution.
Because it waits for return code.You can use start command to create a separate subprocess:
#echo pre
#start "notepad" notepad
#echo post
I've used Windows since NT 3.1, and I too would have said "cmd.exe does not wait for GUI programs to terminate" when you simply type the name of the program (as opposed to using the START command). Though memory grows dim, I believe it originally worked this way. But today, my statement is true interactively, false for "batch" files. Having been thus reminded, I vaguely think it was intentionally changed as some point, since the naïve batch-writer expects sequential execution, but I can't be sure and I don't know when.
I think the answer lies in this question Difference between Windows and Console application.
I quote from two answers.
Konrad Rudolph answered:
The sole difference is that a console application always spawns a console if it isn't started from one (or the console is actively suppressed on startup). A windows application, on the other hand, does not spawn a console. It can still attach to an existant console or create a new one using AllocConsole.
This makes Windows applications better suited for GUI applications or background applications because you usually don't want to have a terminal window created for those.
oefe answered:
Console and Windows applications behave differently when called interactively from the command prompt:
When you start a console application, the command prompt doesn't return until the console application exits. When you start a windows application, the command returns immediately.
This is not true for batch files; they will always wait until the application exits.
The difference in this bahviour between cmd and batch made you think that it worked before.

Sequentially run batch code

Probably a really obvious question, I'm trying to run some sequential batch code to define my own eclipse external run configurations.
One of the calls in the .bat is to run a jetty server, and after this I want to launch a program. At the moment the execution of the .bat means that the call to run jetty hangs on that call, and the call to open the program is only executed once the jetty server has been killed.
Is there any way I can run the call to start jetty, and then immediately run another call to open any program that wont have to wait for the server to be killed.
You can use start to run a program in the background explicitly:
start "" "C:\Program Files\etc.\blah\x.exe"
Execution of the batch file immediately continues after that line. In case of jetty you're probably starting Java anyway. cmd doesn't wait for GUI processes so you can also use
javaw -jar ...\jetty.jar
instead of calling java.
Since the question has changed a bit after the comment:
If there is a reliable way of knowing when jetty has started, e.g. a file that will exist somewhere
:l
timeout /t 1 >nul
if not exists %temp%\somefile goto l
you could use that. Otherwise you can just wait for a while
rem wait two minutes
timeout /t 120 > nul
and hope that everything has started by then.

Is taskkill safe to close a process?

I want to be able to close a process on a remote computer using a .bat file.
eg: taskkill /im Myapp.exe
Is using taskkill a suitable way to close an application? eg like clicking the 'X' on the toolbar?
Does it give the app time to run all of it's closing down methods/destructors? Or does it cause it to end abruptly, losing any data that hasn't had a chance to be written before closing?
Yes, if you dont use /f.

Resources