May you convert this tiny code to Bash code :
user/bin/perl
sleep(300);
system("killall -9 perl &");
sleep(5)
#!/bin/bash
sleep 300
killall -9 perl &
sleep 5
sleep 300
killall -9 perl &
sleep 5
The perl program will kill not only all other perl processes, but also itself, so the functional equivalent translation would be something like
#!/bin/bash
sleep 300
killall -9 perl &
kill -9 $$ &
sleep 5
The final sleep 5 is probably never executed in the original script or in this one, although it is possible that the sleep command at least starts to execute.
If the reason behind translating into bash is exactly that, i.e. the program is supposed not to commit suicide, the other answers are better.
As Dennis Williamson said, in either case, your script should probably not use kill -9 and generally not globally kill, but it depends on your environment if it may have bad side effects.
Related
I am looking for some support on creating some way of running a swift command in terminal to run a program and then stop it after 1 hour then restart.
Example of manual process:
Open Termain.
cd my app
swift run my program --with-parameters
ctrl+c (after 1 hours)
Restart with step 3
I am sure there must be some way using a bash script maybe to start the program by command, kill it after 60min and restart it with a continuous loop like that.
Thanks :-)
You can set up a cron job to do this. Basically, you'll have a bash script, say it's located at /Users/ben/scripts/run_my_program.sh that will, at every hour:
Terminate the current running process (kill pid)
Execute the swift run my program --with-parameters and spit out the process ID
you can get the PID of the swift process you launch with echo $!, and then use sleep 1h to sleep for 1 hour and then kill the process with kill -9 and the PID you got in the first step.
I've read numerous threads on this topic and tried just about everything I've encountered: > /dev/null, qx, system, exec, fork, cmd with | (which worked under win32, but now I'm porting to CentOS which uses the prefork MPM), echo | at now, and Proc::Daemon, but I haven't tried Apache2::Subprocess because it looks like it's exactly what I don't want, a thread that's tied to the parent.
Perhaps my situation is different. At the end of a long-running database restore process, I want to restart the very httpd service that the script is running from. Questions of the wisdom of such a design aside, how can I do this? Every method I've tried stops the script as soon as it executes the sudo service httpd stop half of sudo service httpd restart so it never starts again by itself.
The one exception to this is echo | at now, which seemed promising, but if I copy something that works when I do it on the command line and execute it in the mod_perl script, I get a nice successful sounding line like job 1 at 2013-10-31 19:20 but then nothing happens. No shell mail with now -m, no error messages with 2>&1 and/or > /path/with/all/777/perms, no e-mail from my own module that normally does that on any die, no logfile from the same that auto-logs everything. Just a silent fail despite the success line.
In case it helps, here's what service httpd stop runs:
stop() {
echo -n $"Stopping $prog: "
kill -TERM `cat ${pidfile}`
RETVAL=$?
if [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
then success
else failure
fi
echo
}
This seemed really simple before and there are so many suggested solutions, but none of them seem to do it. What else is there to check or try?
What finally worked was stealing a hint from Apache2::SubProcess' docs.
In the mod_perl script, I just do qx($command 2>&1) although other methods might work too.
Then in script being called in $command, I simply put these lines before the httpd restart:
use POSIX 'setsid';
setsid or die "Can't start a new session: $!";
It doesn't ever return to the mod_perl script, which is fine, since I redirect to a log-display page anyway.
Meanwhile the restart-containing script produces the log correctly through the same old STDOUT redirection I had in there before, and e-mails me if something dies.
Furthermore, the restart-containing script works normally from the command-line, as it was also designed to do.
I use win7 and matlab2012a. I want to write a shell script to test my matlab scripts with different parameters. I use cygwin for this task. For example, alpha is the parameter and the matlab script is getall.m. The matlab script will read parameters from txt file 'param.txt'.
#!/bin/sh
# List=`seq 0.1 0.01 1`
List=`seq 0.1 0.1 0.2`
for alpha in $List
do
echo -ne "20\n61\n80\n1\n0.3\n${alpha}" > param.txt
matlab -nodesktop -r "getall;quit;" #time consuming
done
My problem is that script "getall.m" is time consuming, so I'd like to exec it one at a time. But I found that matlab command returns immediately. So the upper script will start a lot of matlab instances at the same time. I also tried the matlab command in cmd, but nothing changes. In ubuntu, matlab blocks the shell by default.
My question is how to make the matlab command to block the shell in windows?
There's a matlab -wait command line switch on Windows that will make it block.
http://www.mathworks.com/help/matlab/ref/matlabwindows.html
I don't know the "right" way to do this - but I do have a hack for you:
Make the matlab script create a file called "matlabDone" in the /tmp directory just before quitting; your shell script can go around a loop looking for this file. Once it exists, you know matlab is finished. Delete the file, and go around the loop again. Something like this:
List=`seq 0.1 0.1 0.2`
for alpha in $List
do
echo -ne "20\n61\n80\n1\n0.3\n${alpha}" > param.txt
matlab -nodesktop -r "getall;quit;" #time consuming
while [ ! -e /tmp/matlabDone ]
do
sleep 1
done
rm /tmp/matlabDone
done
Then make the last line of your matlab script create the file /tmp/matlabDone...
As I said - it's a hack...
PS I am not 100% sure what functions are available in cygwin. If you can't use sleep, I saw an interesting post suggesting that ping -n 2 127.0.0.1 > /dev/null (or equivalent ... depending on the version of ping you might need -c 2 -i 1 to get "one second per ping, count two") can be an alternative to sleep().
I am writing a Perl script and I need to execute Unix Ctrl+Z on the script.
How can I do it in Perl ?
thanks.
From perl you can send signals to processes with the function kill, which has the same name as the Unix command line tool that does the same thing. The equivalent to Ctrl+Z is running
kill -SIGTSTP pid
you need to find out what numeric value your TSTP signal has on your system. You would do this by running
kill -l TSTP
on the command line. Let's say this returns 20
Then in your Perl script you would add
kill 20 => $$;
which will send the TSTP signal to the currently running process id ($$)
Update:
as described by daxim, you can skip the 'kill -l' part and provide the name of the signal directly:
kill 'TSTP' => $$;
In bash ctrl+z stops the current job and puts it in background with %JobId you can return to this job. I'm not sure what you mean since I thought ctrl+z is caught by bash..
Is it possible to detect when a long running process started with shell-command crashes, so it can automatically be restarted? Without manually checking its buffer and restarting by hand.
I wouldn't handle this from Emacs at all. Instead, I'd write a wrapper script around my original long-running process that restarts the process if it dies in a partiular way. For example, if your program dies by getting the SIGABRT signal, the wrapper script might look like this:
#!/bin/bash
while true
do
your-original-command --switch some args
if [ $? -ne 134 ]; then break; fi
echo "Program crashed; restarting"
done
I got the value 134 for the SIGABRT signal by doing this:
perl -e 'kill ABRT => $$'; echo $?
This is all assuming some kind of Unix-y system.