Run batch/bash command repeatedly over a period with pauses in between - bash

To be clear, I'm seeking an implementation of this in both windows command line (batch file) and in a bash shell. Here is what I want to do:
Run a task/command
Kill the task after running for 1 hour
Wait 2 hours, then repeat(loop)
Preferably with a pure implementation in batch/bash. I've looked a bit around, but have not been able to find a solution to this, plus I'm a beginner, so any hints in the right direction will be appreciated!

For a batch version
#echo off
setlocal enableextensions disabledelayedexpansion
for /l %%a in () do (
start "" myTask.exe
timeout /t 3600
taskkill /im myTask.exe /f
timeout /t 7200
)
Create an infinite loop repeating the indicated sequence start / wait / kill / waitMore

I think You can use something like this in bash :
while true
do
sleep 3600
kill task
done

Have you tried using cron? You can create a script that runs the command, waits 1 hour and exits, which you can set it to run every 3 hours.

Related

Close and restart a process after a certain time period in batch

I'm trying to make a batch file that opens a certain exe and then, after (for example) 5 minutes, closes it then reopens it again. I have tried this:
#echo off
:loop
cd /d %~dp0
certain exe
timeout /t "time" (by minutes)
taskkill /f /im "certain exe"
goto loop
but it wouldn't close the exe nor open it, what can I do?
The problem is that cmd will wait for the current command to end before executing the next command, so timeout (and taskill) will not be executed until example.exe closes by itself.
To ensure that cmd doesn't wait example.exe, you'll need to use start /B, as in this example:
#echo off
:loop
start /B "example.exe"
ping -n seconds_of_delay+1 127.0.0.1>nul
taskkill /f /im "example.exe"
goto :loop
Replace seconds_of_delay+1 with the number of seconds you want the time period to last plus one.
/B is needed because, without it, start would execute example.exe in a new window (if you want that, simply use start).
I used ping as the way to create a time delay because it has been found to consume less processor time than sleep or timeout (you can find more details here).

Windows: Need to force close a process every few minutes so that batch script can start it up again

I have a batch script that starts up a process whenever it detects that the process was closed. I need to force close the process somehow on a set interval loop to see if the batch script is working as it should. What would be the best way to do this? I tried using another batch script to close the process, but didn't get the result as expected since both batch scripts open in the same command window.
In a second script, loop with goto and use a ping for pause.
:loop
:: 301 = 5 minutes. The first ping response is instant.
ping -n 301 0.0.0.0 >NUL
taskkill /im "program.exe" /f
goto loop

Making command prompt wait

#call JBOSSbuildWar.bat > ..\logs\JBOSSbuildWar_out 2> ..\logs\JBOSSbuildWar_err
start cmd /c #call WeblogicbuildWar.bat > ..\logs\WeblogicbuildWar_out 2> ..\logs\WeblogicbuildWar_err
start cmd /c #call FEBAPortletWebWar.bat > ..\logs\FEBAPortletWebWar_out 2> ..\logs\FEBAPortletWebWar_err
start cmd /c #call buildStaticJBoss.bat > ..\logs\JBOSSFEBAStaticWar_out 2> ..\logs\JBOSSFEBAStaticWar_err
I have this set of batch files getting executed in order. I want to fork out this so that they execute in parallel. I have done that using start cmd /c. Now this will fork out new command prompt window for each of them. Assume there are some set of statements after this. I want to make sure they get executed only after all the forked batch files are finished. How to achieve this?
Lets say average time taken by each file is:
JBOSSbuildWar- 30 minutes
WeblogicbuildWar- 35 minutes
FEBAPortletWebWar- 30 minutes
buildStaticJBoss- 35 minutes
Since the main command prompt window has completed its task in 30 minutes, and the forked batch files needs another 5 minutes to complete, I want the main cmd to wait until the others are done. Kindly help.
there's multiple commands, you can choose what one to use,
Pause
Will pause cmd until the user presses any key.
Displays message, "Press any key to continue..."
I use a certain variation of this command called pause>nul.
What it does is pauses the .bat, but doesn't show a message, You just get a blank screen!
TIMEOUT
Multiple syntaxes, very useful command, use this one quite a bit.
Sample code: TIMEOUT 10
Can be bypassed by a key press
Pauses the execution of command by 10 seconds.
You can also structure it like this: TIMEOUT 10 /nobreak
Which does not allow the user to press a key to skip it, they must endure it!
Ping
Very nice one.
Syntax is like this: PING 1.1.1.1 -n 1 -w 60000 >NUL
Probably most complex of the three.
PING can be used to delay execution for a number of seconds.
Hope I helped!
-Logan
Easy way:
In your main batch,
del "%temp%\*.processfinished" >nul 2>nul
...
start ....whatever1.bat...
start ....whatever2.bat...
start ....whatever3.bat...
...
wait4all:
for /L %%a in (1,1,3) do if not exist "%temp%\%%a.processfinished" timeout /t 1 >nul &goto wait4all
:: continues here when all (3) processes have finished.
del "%temp%\*.processfinished" >nul 2>nul
Then in each of the (3) subsidiary .bat files, create a file "%temp%\x.processfinished" where x=1 for the first process, 2 for the second and so on.
When the sub-processes have started, the procedure waits until each has created its own ".processcompleted" file by checking whether any of the 3 is missing, if it it, timeout for 1 second and look again. Only if the 3 files are present will it continue.
In all probability, it would be best if the subsidiary processes could take an extra parameter (the name of this sub-process's "processfinished" file) rather than having a fixed number for each.
You could extend this, and use say the date and time to augment the filename so that this entire process could itself be run many times in parallel.
BTW - by starting the procedure with
#echo off
you can remove all of the leading #s (all that does is suppress the command-reporting for that one line.)
Also, start is happier as start "" ....., that is, with an empty window title in quotes as its first argument. This allows other arguments to be "quoted" as necessary - the very first "quoted" argument used is used as the "window title" for the process and is likely to be lost to the sub-process. Routinely assigning a dummy (empty if necessary) "window title" means you don't trip over this problem in the future.
You can add this timer function before each of the commands:
#call JBOSSbuildWar.bat > ..\logs\JBOSSbuildWar_out 2> ..\logs\JBOSSbuildWar_err
Timeout /t 60 /nobreak >nul
start cmd /c #call WeblogicbuildWar.bat > ..\logs\WeblogicbuildWar_out 2> ..\logs\WeblogicbuildWar_err
Timeout /t 60 /nobreak >nul
start cmd /c #call FEBAPortletWebWar.bat > ..\logs\FEBAPortletWebWar_out 2> ..\logs\FEBAPortletWebWar_err
Timeout /t 60 /nobreak >nul
start cmd /c #call buildStaticJBoss.bat > ..\logs\JBOSSFEBAStaticWar_out 2> ..\logs\JBOSSFEBAStaticWar_err
Ps: 60 stands for 1 minute, if you want 30 minutes, change it to 1800

How to lock the computer after executing an exe file using batch file programming in windows?

I have a batch file program something like.
#echo off
start Mat.exe
>>Need a code here to runand check for termination of "Mat.exe"
rundll32.exe user32.dll, LockWorkStation
>>end of program
If anyone can help me set up the program so that I can lock my computer as soon as the "Mat.exe" file is terminated. I'd really appreciate it. Thanks in advance
Simply drop the start before Mat.exe so your batch-file will wait until Mat.exe has finished.
Edit: This only works if your Mat.exe runs in a console or similar.
If dropping the start didn't work you may have to check wheather or not Mat.exe is still running. For that I found a quite useful post, which should work for you: How to wait for a process to terminate to execute another process in batch file
Edit2: Complete Code:
#echo off
:LOOP
start Mat.exe
TASKLIST 2>&1 | find "Mat.exe" > nul
IF ERRORLEVEL 1 (
rundll32.exe user32.dll, LockWorkStation
) ELSE (
SLEEP 3
GOTO LOOP
)
You can adjust the SLEEP as you like, but i would suggest use at least 1 sec, otherwise you'll have 100% usage.
Try using the Start command with the /Wait switch. Here is an example:
#echo off
REM //start Mat.exe
start /wait [path of Mat.exe]
rundll32.exe user32.dll, LockWorkStation
Remember to use the 8.3 filenames and do not include (" ") in the path string

Batch script run with schedule in windows

I have a doStuff.bat script with this command :
"%HOME%\bin\groovy.bat" "%HOME%\bin\DoSth.groovy"
What can i do to get that command run every 5 minute without using Window Task Schedule?
The timeout command in modern windows will pause for 5 minutes/300 seconds.
#echo off
set "home=c:\home folder"
:loop
call "%HOME%\bin\groovy.bat" "%HOME%\bin\DoSth.groovy"
timeout 300
goto :loop

Resources