Help with Running More than One Program


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Help with Running More than One Program
# 1  
Old 01-20-2010
Question Help with Running More than One Program

Folks,

I'm really new to scripting and was wondering if you could help me out. I have the following script that I inherited:
Code:
#!/bin/bash
#
# Usage
# From the agent directory:
# ./run-any-agent AgentName
#

TAC_AGENT_HOME=`pwd`
LIB=${TAC_AGENT_HOME}/lib
CLASSPATH=.
CLASSPATH=${CLASSPATH}:${TAC_AGENT_HOME}/bin
for i in $( ls ${LIB}/*.jar ); do
  CLASSPATH=${CLASSPATH}:$i
done

java -server -Xmx1024M -Xms512M -cp $CLASSPATH edu.umich.eecs.tac.aa.agentware.Main -config config/$1.conf

So, when I type in

Code:
./run-any-agent MyProgram

it runs "MyProgram". However, since I have many programs that I have to run using this script at the same time, I typically open up many terminals and execute the script on the programs individually. However, this is beginning to be painful. So, I was wondering, if there's any way that I could type in something similar to:

Code:
/run-all-agents MyProgram1 MyProgram2 ... MyProgramN

And have them all run at the same time. A nudge in the right direction would be very much appreciated.

Thank you,

DTW
# 2  
Old 01-20-2010
This should do the trick. '$*' holds the positional parameters that you use when calling "run-all-agents". It executes and starts "run-any-agent" in the background.

Code:
#!/bin/bash

for agent in $*
do
    ./run-any-agent $agent &   # run in background
done

# 3  
Old 01-20-2010
2pugs,

Thanks for your reply.

So, if I understood this right, you're suggesting that I write another script called "run-all-agents" to execute the "run-any-agent" script - right?
Quote:
'$*' holds the positional parameters that you use when calling "run-all-agents".
What do you mean by "positional parameters"? So, will I be calling the script like this?
Code:
./run-all-agents MyProgram1 MyProgram2 ... MyProgramN

I'll mess with this a little and report back. It might also be nice to read the programs I want to run off a file (rather than "manually" typing them in). Anyway, I'll be back.

Thanks,

DTW

---------- Post updated at 04:01 PM ---------- Previous update was at 03:50 PM ----------

Quote:
I'll mess with this a little and report back.
The script seems to run just fine. I tried running two programs for now using the command:
Code:
./run-all-agents MyProgram1 MyProgram2

However, I was wondering if there's a clean way to stop the programs, though. I used to be able to hit Ctrl+C to stop them but I'm not sure that is working very well now. They still run when I press the "Ctrl" key followed by the "C" key. Is there a script that can be written to halt the running programs cleanly too?

Thanks,

DTW

Last edited by DTriniWay; 01-20-2010 at 05:06 PM..
# 4  
Old 01-20-2010
Quote:
Is there a script that can be written to halt the running programs cleanly too?
Sure, but it's a little tricky. You would first need to find out the PID of the agent you started. You could do this with the 'ps' command.

Code:
% ps -ef | grep "run-any-agent MyProgramN " | grep -v grep

  userid 13112 13110  4 15:10:03  ttyp12    00:00:00 run-any-agent MyProgramN

The PID in the above example is 13112. The tricky part is you don't want to leave any child/zombie processes that may have spawned from your script. If it does spawn extra processes then your script will have to find all the children and kill them in order. The last process you would kill would be 13112 since that is your original process. It's definitely doable though. Hope that makes sense.

** NOTE: Notice that I left a space after MyProgramN in my grep statement. This was done to ensure you had the right process for those cases when you might have MyProgram1 and MyProgram11 running. If you're looking for MyProgram1, then you want to make sure you don't accidentally catch MyProgram1N.

Last edited by 2pugs; 01-20-2010 at 05:32 PM..
# 5  
Old 01-20-2010
Quote:
Sure, but it's a little tricky. You would first need to find out the PID of the agent you started. You could do this with the 'ps' command.
Thanks for your reply. Cool. So far I've been doing:
Code:
ps aux | more

And then I scroll through the list to find the PIDs. Sometimes when I use the "kill -9" command, though, it doesn't seem to kill the process. I'm not sure why.
Code:
% ps -ef | grep "run-any-agent MyProgramN " | grep -v grep

  userid 13112 13110  4 15:10:03  ttyp12    00:00:00 run-any-agent MyProgramN

I'm not sure what "-ef" and "-v" do but I can look them up.
Quote:
The PID in the above example is 13112. The tricky part is you don't want to leave any child/zombie processes that may have spawned from your script. If it does spawn extra processes then your script will have to find all the children and kill them in order. The last process you would kill would be 13112 since that is your original process. It's definitely doable though. Hope that makes sense.
Yes, it makes a lot of sense. My next question then would be: How do I find out all the children or zombie processes and then go ahead killing them nicely? This way, then I'd have a neat way (thanks to you) to start the programs and then another neat way to kill them all. It would save me a lot hassle. I must say that scripts are cool. :-)

Thanks,

DTW

P.S:
Quote:
NOTE: Notice that I left a space after MyProgramN in my grep statement. This was done to ensure you had the right process for those cases when you might have MyProgram1 and MyProgram11 running. If you're looking for MyProgram1, then you want to make sure you don't accidentally catch MyProgram1N.
Hmm - I'd have to think about what you wrote, but, thank you for clearing that up.

---------- Post updated at 04:55 PM ---------- Previous update was at 04:34 PM ----------

So, I tried:
Code:
ps -ef | grep "run-any-agent MyProgram1 MyProgram2 MyProgram3 " | grep -v grep

After I typed:
Code:
./run-all-agents MyProgram1 MyProgram2 MyProgram3

But nothing happened...Did I miss something?

DTW

---------- Post updated at 05:15 PM ---------- Previous update was at 04:55 PM ----------

Quote:
I'm not sure what "-ef" and "-v" do but I can look them up.
So, "-e" seems to be a way to use a pattern of some sort. I'm not sure what the "f" after the "e" does, really.
"-v" specifies the string that we don't want to grep.
Code:
grep abc -v

would mean look for all files that DON'T have "abc" in them? Does this sound correct?

DTW
# 6  
Old 01-20-2010
You could try something like this:
Code:
#!/bin/bash
trap killsubs INT
killsubs()
{
  echo "CTRL-C was pressed"
  jobs -p|xargs kill
  echo "Jobs were killed"
  exit
}
for agent in "$@"
do
  ./run-any-agent $agent &   
done
wait

# 7  
Old 01-20-2010
Scrutinizer,

Thanks you for your post. I'll check what you wrote out and report back. I also tried:
Code:
ps aux | grep run-any-agent

And it returned:
Code:
DTW    31685  0.0  0.0   2988  1368 pts/7    S    16:48   0:00 /bin/bash ./run-any-agent MyProgram1
DTW    31686  0.0  0.0   2988  1372 pts/7    S    16:48   0:00 /bin/bash ./run-any-agent MyProgram2
DTW    31687  0.0  0.0   2988  1364 pts/7    S    16:48   0:00 /bin/bash ./run-any-agent MyProgram3

Perhaps that could be used somehow too?

Thanks,

DTW

---------- Post updated at 05:40 PM ---------- Previous update was at 05:27 PM ----------
Quote:
Thanks you for your post. I'll check what you wrote out and report back.
Quote:
Originally Posted by Scrutinizer
You could try something like this:
Code:
#!/bin/bash
trap killsubs INT
killsubs()
{
  echo "CTRL-C was pressed"
  jobs -p|xargs kill
  echo "Jobs were killed"
  exit
}
for agent in "$@"
do
  ./run-any-agent $agent &   
done
wait

I tried running this...It didn't apparently do anything that I could see. Hmm - interesting.

DTW
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Running C program in UNIX

I want to run a C program from my BASH script. Here's some very basic simplified code of my bash script: #!/bin/bash echo "Run C program" ./main.c echo "Ran C program" Here's my main.c: #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv) { ... (3 Replies)
Discussion started by: millsy5
3 Replies

2. Shell Programming and Scripting

Running a program using csh

I have a program which I can run on the command line like below and works fine /nethome/chrisd/HSeis/TommyCD/TommyCD-1101/bin/raytrac vmod=npt10-z30.vmod srfile=jcdint.sc rcfile=jcdint.rc phases="SP FS" level=twop format="X T" dtau=0.1 mdacc=0.5 mindist=0.1 maxitertp=25 ray=npt10-z30.ry... (0 Replies)
Discussion started by: kristinu
0 Replies

3. UNIX for Dummies Questions & Answers

Running a program (Dynflow)

Lets get some stuff out of the way before the question. I am currently running FreeBSD 7.0 on a VirtualBox virtual machine. I do not know much about Unix or FreeBSD, though I do run linux at home. My boss gave me some files that he says are a unix version of the program Dynflow. The Programs... (0 Replies)
Discussion started by: poet_will
0 Replies

4. Programming

running a parallel program

hi , i need to run a parallel program . for example; program1 { array=" the second program should called here : program 2" the execution should continue } the 2nd program should recieve an array of information as argument and it should... (4 Replies)
Discussion started by: bankpro
4 Replies

5. Programming

running a program for a specified time

how can i run a program for a specified time? i need to print a current time during program execution. (3 Replies)
Discussion started by: prosputko
3 Replies

6. UNIX for Dummies Questions & Answers

Running a program on boot!

Hi there! I tried to search for something like this here but couldn't find anything. I need to run a specific program when linux starts up. I need to run it after the rp-pppoe has started because this prog needs internet connection. I start the program by entering ./dynix start (its in my home... (4 Replies)
Discussion started by: D-Lexy
4 Replies

7. UNIX for Dummies Questions & Answers

Running a program

Hi.Iam new to Linux.i got linux 7.0 pro and dont know how to run programs. I want a perl interputer and i know i installed one but how do i run it ??? Also how do i run a C or C++ editor ?and how do i run cron ? (3 Replies)
Discussion started by: perleo
3 Replies

8. Programming

running a c/c++ program in unix

This is not a question, but rather a simple how-to for programmers who are new to the UNIX environment. I too,am new to UNIX. First I developed a few programs on my box and perfected them until they were satisfactory for execution. Problem was however, that once i compiled and all that,... (2 Replies)
Discussion started by: kray
2 Replies

9. Shell Programming and Scripting

Running a program automatically

How can I make a program run automatically at a certain time of day? My problem is I need to make a small backup program that will back up a few files every day? (3 Replies)
Discussion started by: jvadn0
3 Replies

10. Programming

Running a compiled Program

Just getting into the Unix command line programming and am unable to run any program I write. I am using a Makefile and the source is compiling but when I enter the name of the output file I get back: bash: lab01exe.out: command not found I'm sure I am just dooing something simple... (2 Replies)
Discussion started by: Krebsbac
2 Replies
Login or Register to Ask a Question