IPB

Bienvenue invité ( Connexion | Inscription )

 
Reply to this topicStart new topic
> Applescript et multitache, C'est possible?
Options
__toto__maison
posté 8 Sep 2004, 20:04
Message #1


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 1 915
Inscrit : 9 Mar 2004
Membre no 16 011



C'est une question que je me pose pour un projet de front end d'un soft libre.
Donc dans ce cas, j'aurai par exemple une liste de fichier a traité. Comme j'utilise un soft en ligne de commande, ca vas donner du do shell script.

Comment faire pour lancer les do shell script a la suite sans attendre la réponse, et ne pas etre obliger d'attendre que le fichier précédent ait été traité.

Si qq a une idée....

Les scripts objet peuvent-t-il faire ca?


--------------------
Venez tester votre mac avec bench It! et comparez les résultats
Go to the top of the page
 
+Quote Post
Doom Hammer
posté 8 Sep 2004, 20:22
Message #2


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 844
Inscrit : 10 Jul 2002
Membre no 2 871



ignoring application responses
do shell script "blabla"
...
do shell script "blabla"
end ignoring

Essaie ça, normalement dans ce cas, AppleScript d'attend plus de recevoir une réponse de la part de l'application pilotée pour passer à la commande suivante.
A vérifier avec les do shell script.
Go to the top of the page
 
+Quote Post
ddrix
posté 8 Sep 2004, 20:24
Message #3


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 1 094
Inscrit : 24 Jul 2003
Lieu : Berlin
Membre no 8 749



Oui, c'est possible mais ça n'est pas évident à trouver !
On penserait qu'il suffirait de mettre
CODE
do shell script "truc &"
mais en fait c'est
CODE
do shell script "truc > /dev/null 2>&1 &"


vu dans une technote : http://developer.apple.com/technotes/tn2002/tn2065.html
QUOTE
Q: I want to start a background server process; how do I make do shell script not wait until the command completes?

A: Use "do shell script "command > file_path 2>&1 &"". do shell script will return immediately with no result and your AppleScript script will be running in parallel with your shell script. The shell script's output will go into file_path; if you don't care about the output, use "/dev/null". There is no direct support for getting or manipulating the background process from AppleScript, but see the next question.


Ce message a été modifié par ddrix - 8 Sep 2004, 22:38.
Go to the top of the page
 
+Quote Post
__toto__maison
posté 8 Sep 2004, 20:31
Message #4


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 1 915
Inscrit : 9 Mar 2004
Membre no 16 011



QUOTE
truc > /dev/null 2>&1


C'est pour envoyer le flux de sortie de la commande vers une autre sortie.

La j'ai pas de mac sous la main, mais si ton truc marche Doom, alors je dois pouvoir lancer une commande en enregistrant la sortie de la commande dans un fichier >>log-tache.txt
Donc faire ma commade sans perdre la possibilité de suivre le résultat.
A moins qu'il ne soit possible de lancer la commnde avec le & ET de faire une sortie vers un fichier.

Merci !

Bon, ben la suite ca sera quand j'aurais la becanne sous la main.

Ce message a été modifié par __toto__maison - 8 Sep 2004, 20:36.


--------------------
Venez tester votre mac avec bench It! et comparez les résultats
Go to the top of the page
 
+Quote Post
manu_t
posté 8 Sep 2004, 20:51
Message #5


Adepte de Macbidouille
*

Groupe : Membres
Messages : 178
Inscrit : 22 May 2003
Lieu : Marseille
Membre no 7 716



si tu lis bien le texte de Apple, la bonne commande serait plutôt la suivante :
CODE
truc > /dev/null 2>&1 &


Emmanuel

Ce message a été modifié par manu_t - 8 Sep 2004, 20:51.
Go to the top of the page
 
+Quote Post
ddrix
posté 8 Sep 2004, 22:41
Message #6


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 1 094
Inscrit : 24 Jul 2003
Lieu : Berlin
Membre no 8 749



Effectivement faute de frappe de ma part ph34r.gif j'avais oublié le dernier &

Mais je confirme que cela marche en faisant
CODE
do shell script "truc > /dev/null 2>&1 &"
Je l'utilise dans un de mes scripts (un truc bizarre où mon applescript appelle un script perl qui exécute de l'applescript - et pour cela il faut que l'exécution du premier applescript soit finie, sinon on a un deadlock).

La partie importante a l'air d'être le "2>&1 &", quelqu'un sait ce que ça veut dire en sh au fait ? juste par curiosité...

Ce message a été modifié par ddrix - 8 Sep 2004, 22:44.
Go to the top of the page
 
+Quote Post
Dam-le-Damdam
posté 9 Sep 2004, 15:32
Message #7


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 886
Inscrit : 14 Apr 2003
Lieu : Montréal, Québec, Canada
Membre no 7 121



En tout cas, c'est intéressant comme info, car les "do shell" bloquait les autres process, ca ne doit plus être le cas maintenant, non ??? Car j'avais un script perl qui était lancé par mon AppleScript et qui utilisait 80% des ressources au moins !!!! (backup d'une library iTunes avec conversion pour Mac OS 9).


--------------------
Machine: MacBook Pro 13' 2.66 / 4go RAM
Réseau: TimeCapsule / Airport Express / NAS Synology 110J

Mon blog - Mini Bulles - Aviation
Go to the top of the page
 
+Quote Post
ddrix
posté 9 Sep 2004, 16:10
Message #8


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 1 094
Inscrit : 24 Jul 2003
Lieu : Berlin
Membre no 8 749



Je ne pense pas que ça change quelque chose au niveau du système en général, ça ne fait que séparer l'exécution de l'applescript et du shell script. C'est normal qu'un process prenne autant de CPU qu'il peut, mais il ne bloque pas les autres process pour autant, c'est une question de priorités.
Go to the top of the page
 
+Quote Post
manu_t
posté 9 Sep 2004, 22:22
Message #9


Adepte de Macbidouille
*

Groupe : Membres
Messages : 178
Inscrit : 22 May 2003
Lieu : Marseille
Membre no 7 716



QUOTE(ddrix @ 8 Sep 2004, 23:41)
CODE
truc > /dev/null 2>&1 &"


La partie importante a l'air d'être le "2>&1 &", quelqu'un sait ce que ça veut dire en sh au fait ? juste par curiosité...
[right][snapback]840263[/snapback][/right]


explications :
CODE
> /dev/null
redirige la sortie standard vers le fichier /dev/null (donc ici vers les oubliettes, mais on peut y mettre un vrai fichier)

CODE
2>&1
redirige le flux d'erreurs standard (2) vers le flux standard 1 (c'est à dire la sortie standard qui a déjà été redirigée

CODE
&
permet de séparer l'exécution de la commande du shell qui l'a lancé.
C'est en fait cet argument qui permet de ne pas bloquer le script, le 2 autres paramètres servent simplement à effacer tout ce que pourrait écrire la commande.

De façon générale, la redirection s'écrit comme cela :
CODE
commande < fichier_entrees.txt > fichier-sorties.txt 2>fichier_erreurs.txt


pour plus d'infos :
CODE
man bash


Emmanuel

Ce message a été modifié par manu_t - 9 Sep 2004, 22:23.
Go to the top of the page
 
+Quote Post
ddrix
posté 9 Sep 2004, 23:03
Message #10


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 1 094
Inscrit : 24 Jul 2003
Lieu : Berlin
Membre no 8 749



merci pour les explications smile.gif
Mais ce qui est bizarre c'est qu'un simple
CODE
do shell script "truc &"
ne marche pas...
Il faut qu'il y ait "> /dev/null" ET "2>&1" en plus du & final, sans doute parce que la commande do shell script essaye de récupérer la sortie ?

Ce message a été modifié par ddrix - 9 Sep 2004, 23:03.
Go to the top of the page
 
+Quote Post
Dam-le-Damdam
posté 10 Sep 2004, 07:37
Message #11


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 886
Inscrit : 14 Apr 2003
Lieu : Montréal, Québec, Canada
Membre no 7 121



QUOTE(ddrix @ 10 Sep 2004, 00:03)
merci pour les explications smile.gif
Mais ce qui est bizarre c'est qu'un simple
CODE
do shell script "truc &"
ne marche pas...
Il faut qu'il y ait "> /dev/null" ET "2>&1" en plus du & final, sans doute parce que la commande do shell script essaye de récupérer la sortie ?
[right][snapback]841673[/snapback][/right]

Logique, sinon ton script attend un résultat... Là non, donc il peut continuer ce qu'il doit faire.


--------------------
Machine: MacBook Pro 13' 2.66 / 4go RAM
Réseau: TimeCapsule / Airport Express / NAS Synology 110J

Mon blog - Mini Bulles - Aviation
Go to the top of the page
 
+Quote Post
Doom Hammer
posté 10 Sep 2004, 11:14
Message #12


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 844
Inscrit : 10 Jul 2002
Membre no 2 871



ignoring application responses
set le_resultat to do shell script "blabla"
...
set le_resultat2 to do shell script "blabla"
end ignoring

Tu peux récupérer les résultats comme ceci et tout devrait se faire en même temps.
A tester... wink.gif
Go to the top of the page
 
+Quote Post
le grimpeur
posté 11 Sep 2004, 22:28
Message #13


Expressivité Bovine
****

Groupe : Membres
Messages : 1 268
Inscrit : 23 Jun 2003
Lieu : Chez les Gones, mais vert de coeur...
Membre no 8 222



Salut Doom!!!
Eh ben j'ai testé et non, il faut faire un truc avec top comme je te l'avait expliqué à l'AE.
En fait, on ignore la reponse avec la routine ignore, et et lance dans une boucle non bloquante une commande top avec certains paramètres, pour récupérer l'ID du process et ainsi pouvoir en connaître et controler l'état à l'aide de signaux POSIX. (ça touche au C mais c'est compréhensible, rappel : signaux POSIX = SIGTERM,SIGKILL...pour stopper le process).
Ils parlaient de ça sur la mailing list applescript d'apple.à chercher pour avoir les détails..

Si qqun à une soluce fonctionelle plus simple (avec un appel OBJ-C ou java à mon avis), faite nous signe


--------------------
Hackintosh | i3 540 3,07 Ghz | 8 Go DDR 1333 | SSD 60 Go Vertex 2 | Samsung EcoGreen F3 500 Go | Radeon 5770 HD 1Go DDR5 | Mac Os Lion 10.7.4
Synology Ds211j 2 x 1To RAID 1
iPhone 3GS | 16Go | iOS 5.1.1

Plus t'en chies fort, moins t'en chies longtemps. - proverbe montagnard -
Go to the top of the page
 
+Quote Post
ddrix
posté 11 Sep 2004, 23:24
Message #14


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 1 094
Inscrit : 24 Jul 2003
Lieu : Berlin
Membre no 8 749



Pour ce qui est de récupérer le pid il y a une méthode plus simple dans la même technote :

QUOTE("tn2065")
Q: I have started a background process; how do I get its process ID so I can control it with other shell commands?

A: You can use a feature of sh to do this: the special variable $! is the ID of the most recent background command, so you can echo it as the last command in your shell script, like this:

CODE
do shell script "my_command > /dev/null 2>&1 & echo $!"
-- result: 621
set pid to the result
do shell script "renice +20 -p " & pid
-- change my_command's scheduling priority.
do shell script "kill " & pid
-- my_command is terminated.


Après pour contrôler, je ne vois en effet pas d'autre solution que des signaux POSIX ou une hypothétique ScriptingAddition...

Ce message a été modifié par ddrix - 11 Sep 2004, 23:27.
Go to the top of the page
 
+Quote Post
Doom Hammer
posté 12 Sep 2004, 00:34
Message #15


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 844
Inscrit : 10 Jul 2002
Membre no 2 871



QUOTE(le grimpeur @ 11 Sep 2004, 23:28)
Salut Doom!!!
Eh ben j'ai testé et non, il faut faire un truc avec top comme je te l'avait expliqué à l'AE.

Ah... ça marche par exemple pour dupliquer plusieurs éléments en même dans le Finder par exemple. Pour des shell script ça doit être différent. wink.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 utilisateur(s) sur ce sujet (1 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :

 



Nous sommes le : 28th April 2024 - 14:14