Restart srvany when child process gets killed - windows

I've created a service, which is a plain console application running via srvany.exe. It was set up to immediately restart when destroyed. Here's the script:
sc delete "Test Service"
sc create "Test Service" binpath= "C:\Windows\System32\srvany.exe" start= auto
sc failure "Test Service" reset= 86400 actions= restart/0
sc description "Test Service" Blah
reg add "HKLM\SYSTEM\CurrentControlSet\Services\Test Service\Parameters" /v Application /d "C:\<path>\testserv.exe"
sc start "Test Service"
It's created properly, and restarts if I kill srvany with taskmgr. But when I kill testserv, srvany keeps running, effectively ruining my plans for immediate restart.
Is there a (either console or registry) key for srvany to exit when its child process gets killed? If not, is there any other simple ways to accomplish this task (without writing a service)?

While srvany will gladly start your application as a service, it does not monitor the spawned process in any way to achieve what you want. We have a competing software called AlwaysUp; read more about srvany's shortcomings there.

The article in CoreTech's answer is from AlwaysUp which itself is a paid application. If you are looking for a free alternative that monitors child processes, try NSSM.

Related

How to stop firebird process that was run as application in command line?

We may run Firebird as application using command line:
firebird.exe -a -p 3050
Is that possible to shutdown the firebird process using command line too?
There is no "easy" way to do it. If you started firebird.exe as an application, you can quit it by right-clicking on its icon in the taskbar, and selecting shutdown.
The only alternative is to kill it using taskkill, for example:
taskkill /IM firebird.exe
This has the following downsides:
if you have active connections, this will produce a popup to ask for confirmation of shutdown (just like when doing this from the taskbar)
if you have multiple firebird.exe processes, they will all be terminated
You can also force kill to shutdown, this will not produce the popup; open connections will be killed without prompting:
taskkill /F /IM firebird.exe
However, if you regularly need to do this, it might be better to install Firebird as a Window service that doesn't startup automatically. You can then control the service using NET START and NET STOP (or using instsvc).
For example, install Firebird as a service (require administrator command prompt):
instsvc install -demand -name firebird3
This creates a service called "Firebird Server - firebird3"
You can then start and stop the service using NET START "Firebird Server - firebird3" and NET STOP "Firebird Server - firebird3", although this also requires elevated administrator privileges.

Could not stop in a timely manner

I am having a windows service which I am planning to do an auto restart through windows batch file using "net stop" command. Sometime the service may stop abruptly and show a message box "Could not stop windows service".
Please advise me if i stop the service from windows batch file using "net stop" command whether the popup message will show if the command is unable is stop the service. Kindly assist.
Net Stop is synchronous, meaning it will wait until the service is stopped.
So you are planning to restart the service just do
net stop servicename && net start servicename
net stop will wait until the service is stopped and then run net start
Additionally, using the && method, we reply on the first command to be successful then run the second, if the first command fails, it will not run the second command.
If you have a very stubborn service which is not able to stop, you can build in a loop to check if it is running by using tasklist then attempt to restart if %ERRORLEVEL% is not 0.
You can also see how long the timeout is for the Service Kill in regedit:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\WaitToKi‌​llServiceTimeout
Mine for instance in windows 8 is set to 5000 seconds

Run powershell script whenever a server reboot is initiated and show the script progress in cmd

I need to run a powershell script whenever the server is rebooted/shutdown (whether graceful or disgraceful reboot).
The script will stop 4 application services at an interval of 1 minute and then finally reboots the system.(This is a business requirement, don't ask why)
How can I make server to invoke the .ps1 script whenever a reboot or a shutdown is initiated.
My test results:
I tried to create a test script which will generate a text file with current date/time and added it to the scheduled task on the trigger of event log 6006 (which is created whenever a system reboot/shutdown is initiated.)
I checked the box -"Run with highest privileges" but after system restart no text file was generated as it was supposed to, although it generates when ran manually.
Do we have any better approach to implement this?
(My final expectation should look like this-
On a random day a random user initiated reboot after a monthly patch when a command prompt window opens before him with message something like:
Stopping service abc...
Stopped.
Waiting for 60 seconds.
Stopping service xyz...
Stopped
EDIT: I've been successfully able to invoke the .ps1 file by adding it to the gpedit as suggested by Kory and Alroc but the script runs only in background when computer restart is initiated. It doesn't opens a regular cmd window to show the progress.
I'm adding the .ps1 script as well below which stops 2 services(chosen for testing purpose) at an interval of 10 seconds and will show the timer as well, only when ran manually.When invoked by the shutdown command it'll stop services only in the background without showing the progress to the user. Kindly assist to achieve this?
Write-Host "Shutdown script invoked"
stop-service W32Time -force -PassThru
for($i = 10 ; $i -gt 0 ; $i--)
{
Write-Progress -Activity "`n Waiting for" -status "`$i equals $i seconds"
sleep 1
}
stop-service wuauserv -force -PassThru
You can use GPO to configure a shutdown script for systems.
You might be able to to it via a Win32_ComputerShutdownEvent watcher as well.
After deep digging, I've finally figured out how to make the cmd window visible while system shutdown in progress.
Here is the complete steps of performing above mentioned expectation:
Open gpedit.msc
Navigate to Computer Configuration->Windows
Settings->Scripts(Startup/Shutdown)->Shutdown.
Go to Shutdown properties. In the powershell scripts tab add your
script and select 'Run Windows Powershell script first'
Above steps will enable the invoke of script at every system shutdown. Now to make the script visible and show progress:
Navigate to Computer Configuration->Administrative
Templates->System->Scripts
Among the policies showing in the right pane enable below
properties:
Run Windows Powershell scripts first at computer start,shutdown
Run shutdown scripts visible

Check status of Service and then execute command and echo status to user

I am trying to create a script that checks if the service Print Spooler is running or not.
The commands to start and stop, and check the status are listed below.
sc start Spooler # Starts service
sc stop Spooler # Stops service
sc query Spooler # Returns status of Spooler
I wanted to hide the output of these commands from the user.
I wanted to check if the service is running.
If yes, then echo to user "Print Spooler already running." and then pause before close.
If no, then echo "Service stopped" then start the service and echo "Service starter" and then pause before close.
Any help will be appreciated.
Why would you want to do something so roundabout. We don't test then do, we do then test if it worked. Testing often uses the same resources as doing, so you chewed up twice the battery life, slowed other programs down TWICE.
#echo off
sc start spooler>%temp%\status.txt
findstr /c:"1056"<%temp%\status.txt>nul&&(Echo Service Already Running&pause&Goto :EOF)
findstr /c:"FAILED"<%temp%\status.txt>nul&&(Echo Service Can't Start&pause&Goto :EOF)||(Echo Service Started&pause&Goto :EOF)

Really killing a process in Windows

Occasionally a program on a Windows machine goes crazy and just hangs. So I'll call up the task manager and hit the "End Process" button for it. However, this doesn't always work; if I try it enough times then it'll usually die eventually, but I'd really like to be able to just kill it immediately. On Linux I could just kill -9 to guarantee that a process will die.
This also could be used for writing batch scripts and writing batch scripts is programming.
Is there some program or command that comes with Windows that will always kill a process? A free third-party app would be fine, although I'd prefer to be able to do this on machines I sit down at for the first time.
"End Process" on the Processes-Tab calls TerminateProcess which is the most ultimate way Windows knows to kill a process.
If it doesn't go away, it's currently locked waiting on some kernel resource (probably a buggy driver) and there is nothing (short of a reboot) you could do to make the process go away.
Have a look at this blog-entry from wayback when: http://blogs.technet.com/markrussinovich/archive/2005/08/17/unkillable-processes.aspx
Unix based systems like Linux also have that problem where processes could survive a kill -9 if they are in what's known as "Uninterruptible sleep" (shown by top and ps as state D) at which point the processes sleep so well that they can't process incoming signals (which is what kill does - sending signals).
Normally, Uninterruptible sleep should not last long, but as under Windows, broken drivers or broken userpace programs (vfork without exec) can end up sleeping in D forever.
taskkill /im myprocess.exe /f
The "/f" is for "force".
If you know the PID, then you can specify that, as in:
taskkill /pid 1234 /f
Lots of other options are possible, just type taskkill /? for all of them. The "/t" option kills a process and any child processes; that may be useful to you.
Process Hacker has numerous ways of killing a process.
(Right-click the process, then go to Miscellaneous->Terminator.)
JosepStyons is right. Open cmd.exe and run
taskkill /im processname.exe /f
If there is an error saying,
ERROR: The process "process.exe" with PID 1234 could not be
terminated.
Reason: Access is denied.
then try running cmd.exe as administrator.
Get process explorer from sysinternals (now Microsoft)
Process Explorer - Windows Sysinternals | Microsoft Docs
One trick that works well is to attach a debugger and then quit the debugger.
On XP or Windows 2003 you can do this using ntsd that ships out of the box:
ntsd -pn myapp.exe
ntsd will open up a new window. Just type 'q' in the window to quit the debugger and take out the process.
I've known this to work even when task manager doesn't seem able to kill a process.
Unfortunately ntsd was removed from Vista and you have to install the (free) debbugging tools for windows to get a suitable debugger.
setup an AT command to run task manager or process explorer as SYSTEM.
AT 12:34 /interactive "C:/procexp.exe"
If process explorer was in your root C drive then this would open it as SYSTEM and you could kill any process without getting any access denied errors. Set this for like a minute in the future, then it will pop up for you.
FYI you can sometimes use SYSTEM or Trustedinstaller to kill tasks ;)
google quickkill_3_0.bat
sc config TrustedInstaller binPath= "cmd /c TASKKILL /F /IM notepad.exe
sc start "TrustedInstaller"
I had this issue too, here is how I solved it.
1/ Open the « task manager « 
2/ Locate the application name in the list
3/ Once found, right click on its name then click on « properties »
4/ In the properties interface, click on « security « 
5/ Click on « edit » to change permissions
6/ « Deny » all permissions for all users, click on «  apply » then « ok »
7/ click on « advanced » for special permissions settings
8/ Remove permissions for all users
9/ click on «  apply » then « ok »
10/ click on «  apply » then « ok » again
11/ you can now kill the process on task manager as well as uninstall the app of you want to.
When ntsd access is denied, try:
ZeroWave was designed to be a simple tool that will provide a multilevel termination of any kind of process.
ZeroWave is also a easy-to-use program due to its simple installation and its very friendly graphical interface.
ZeroWave has three termination modes and with the "INSANE" mode can terminate any kind of process that can run on Windows.
It seems that ZeroWave can't kill avp.exe
wmic process where processid="11008" call terminate

Resources