Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

bash: start multiple chained commands in background

I'm trying to run some commands in paralel, in background, using bash. Here's what I'm trying to do:

forloop {   //this part is actually written in perl   //call command sequence   print `touch .file1.lock; cp bigfile1 /destination; rm .file1.lock;`; } 

The part between backticks (``) spawns a new shell and executes the commands in succession. The thing is, control to the original program returns only after the last command has been executed. I would like to execute the whole statement in background (I'm not expecting any output/return values) and I would like the loop to continue running.

The calling program (the one that has the loop) would not end until all the spawned shells finish.

I could use threads in perl to spawn different threads which call different shells, but it seems an overkill...

Can I start a shell, give it a set of commands and tell it to go to the background?

like image 381
Mad_Ady Avatar asked Oct 02 '08 07:10

Mad_Ady


People also ask

How do I run multiple commands in the background?

Running Multiple Commands as a Single Job We can start multiple commands as a single job through three steps: Combining the commands – We can use “;“, “&&“, or “||“ to concatenate our commands, depending on the requirement of conditional logic, for example: cmd1; cmd2 && cmd3 || cmd4.

How do you chain multiple commands in Bash?

Ampersand Operator (&) Sixth Bash shell command line Chaining Operator (Linux operator) is Ampersand Operator (&). Ampersand Operator is a kind of operator which executes given commands in the background. You can use this operator to execute multiple commands at once.

How run multiple processes in background Linux?

You can use the & to start multiple background jobs. This will start multiple jobs running in the background. If you want to keep a job running in the background, once you exit the terminal you can use nohup .


1 Answers

I haven't tested this but how about

print `(touch .file1.lock; cp bigfile1 /destination; rm .file1.lock;) &`; 

The parentheses mean execute in a subshell but that shouldn't hurt.

like image 152
Hugh Allen Avatar answered Nov 15 '22 23:11

Hugh Allen