2009-09-02 7 views
3

Je cours des exécutables fastidieux avec différents paramètres affectés dans une boucle en tant que travaux d'arrière-plan en parallèle. Voici un exemple de jouet et sa sortie:Notifier lors de l'exécution des travaux d'arrière-plan en cours d'exécution dans bash

bash-3.2$ set -o notify 
bash-3.2$ for ((i=0 ; i < 4 ; i+=2)); do 
> sleep ${i} & 
> done 
[1] 32394 
[2] 32395 
bash-3.2$ [1]- Done     sleep ${i} 
[2]+ Done     sleep ${i} 

Notez que lorsque chaque travail se termine, il m'avertira. Dans le message de fin, la commande du travail sera affichée, mais de la façon dont le paramètre n'est pas développé, il n'y a donc pas de moyen évident de dire quelle valeur de paramètre il utilise en regardant le message. Ce que j'espère que le message est comme

bash-3.2$ [1]- Done     sleep 0 
[2]+ Done     sleep 2 

Est-il possible de le faire?

Merci pour votre intérêt!

Répondre

1

Pas très jolie:

for ((i=0 ; i < 4 ; i+=2)); do 
    sleep ${i} && echo -en "\nsleep ${i} "& 
done 

résultat ressemble à:

[1] 29311
[2] 29313

sommeil 0 [1] - sommeil Fait $ {i} & & echo -en "\ nsleep $ {i}"
utilisateur @ hôte: ~
$ sommeil 2 [2] + $ {sommeil Fait i} & & echo -FR "\ Nsleep $ {i}"

Une fonction pourrait neaten il un peu:

myeval() { 
    eval "$*" && echo -en "\n$* " 
} 

Ensuite, vous pouvez faire:

for ((i=0 ; i < 4 ; i+=2)); do 
    myeval "sleep ${i}"& 
done 

et la sortie ressemble à:

[1] 29635
[2] 29636

sommeil 0 [1] - Fait myeval "sleep $ {i}"
user @ host: ~
$ sommeil 2 [2] + myeval "fait sommeil $ {i}"

0

Si vous êtes désireux d'attendre jusqu'à ce que le dernier est fait ..

for ((i=0; i < 4; i+=2)); do 
    long_running_process $i & 
done 

wait 

Chaque long_running_process (en supposant qu'il s'agit d'un script shell) peut imprimer un message d'état et son propre $ 1 immédiatement avant la fin.

+0

Mais alors il ne reçoit pas la réaction immédiate que lui donne "set -o notify". –