Acabei de escrever este script simples, que chamei de 'cpw', para resolver este problema.
Você o usa exatamente como você usaria cp ... a única diferença é que ele constrói uma matriz de qualquer processo cpw que já esteja rodando quando é iniciado, e espera que eles terminem antes de passar os comandos para cp . Desta forma, ele se comporta como uma fila auto-organizada.
Você pode continuar adicionando trabalhos em background cpw, mas eles não interferem uns nos outros. Eles vão executar um de cada vez.
Tenho certeza de que outras pessoas podem sugerir melhorias.
#!/bin/bash
cpwpids=('ps -ef | grep $USER | grep 'cpw' | grep -v grep | grep -v $$ | awk '{ print $2 }'') #build an array of all cpw procs for this user that aren't this one.
cpwcnt=${#cpwpids[@]} # number of elemenets in the above array
cnt=$cpwcnt # counter to be decremented each pass
while [ $cnt -gt 0 ]
do
cnt=$cpwcnt
for i in "${cpwpids[@]}" # check if each pid has died yet
do
ps --pid $i >/dev/null
if [ $? -gt 0 ]
then
let "cnt -= 1"
fi
done
sleep 2
done
cp -v "$@" >> /tmp/cpw.log #log
Exemplo de uso:
$ cpw -R /src/tree /dest/tree &