applescript et démarrage automatique

  • Créateur du sujet Créateur du sujet zilch
  • Date de début Date de début

zilch

Membre confirmé
31 Mai 2006
44
0
67
Belgique
users.skynet.be
Bonsoir,

Je place un script parfaitement fonctionnel et enregistré en tant qu'application dans la liste des applications à lancer au démarrage de la session.

Ce script ne contient qu'une ligne :
Bloc de code:
do shell script "/usr/sbin/disktool -p disk1s1 0 > /dev/null"
Ce script fonctionne parfaitement.

Au démarrage : il est censé s'exécuter automatiquement. Pourtant j'ai une fenêtre qui me demande si je veux exécuter ce script avec deux boutons : quit et run.

Le fait que cette fenêtre apparaît peut-il être expliquer par le fait que le disque qu'il est censé démonter n'apparaît que tardivement sur le bureau ? Y a-t-il une autre raison ? Et si c'est le cas, comment faire en sorte que le script ne s'exécute qu'après le montage des disques (ici des disques firewire) ?

Didier
 
Solution de facilité : tu ajoutes un sleep devant ta commande UNIX.

Solution plus "smart" : tu boucles tant que "diskutil list | grep <le nom de ton volume>" ne renvoie pas 0. Met un nombre maximum d'essais et une tempo entre les essais pour ne pas boucler indéfiniment.

PS : disktool est "deprecated", utilise diskutil à la place.
 
Super vos réponses. Je vais voir tout cela et je reposte en cas de problème.

Didier
 
J'ai encore un problème :

En utilisant la commande shell disktool tout marche à merveille. Mais comme l'a souligné ntx, elle est deprecated et je tente d'utiliser diskutil à la place :
Bloc de code:
do shell script "/usr/sbin/diskutil unmount /Volumes/Backup > /dev/null"
ou
Bloc de code:
do shell script "/usr/sbin/diskutil unmount /dev/disk1s1 > /dev/null"
mais dans les deux cas, il démonte bien le disque mais me met une boîte de dialogue avec :
Volume failed to unmount - Edit -- Ok-
Je pense que c'est lié à un problème de timing : le script s'exécutant trop tôt.

Comment faire pour mettre un délai : je n'arrive pas à mettre en place la boucle "diskutil list | grep Backup".

Un coup de main est le bienvenu.

Merci à vous.
 
J'ai fait ça :
Bloc de code:
repeat
    set test to boolean returned of (do shell script "diskutil list | grep /Volumes/Backup")
    if test then exit repeat
end repeat

do shell script "/usr/sbin/diskutil unmount /Volumes/Backup > /dev/null"
mais ça ne fonctionne pas : à l'exécution il m'affiche : "La commande s’est arrêtée avec un état non nul." tout en surlignant la partie do shell script "diskutil list | grep /Volumes/Backup".

Où se trouve le problème ?
 
Je n'y connais rien en Apple Script donc je ne dirais rien sur la syntaxe de ton script. Mais en général une commande shell renvoie 0 quand elle s'est exécutée normalement (à vérifier pour diskutil vu que la page man ne dit rien à ce sujet), donc il faudrait tester un entier et pas un booléen. De plus entre deux commandes "diskutil list", met en temporisation sinon il va boucler trop vite.
 
Merci ntx pour tes observations. J'ai changé le type en integer et rajouté un délai mais j'ai toujours le même message. Je tente de trouver des infos sur diskutil sur le net, mais il n'y a pas pléthore.
 
J'ai essayé la commande dans le terminal. Tu as 0 si le grep trouve quelque chose et 1 s'il ne trouve rien.
 
Ah, merci pour l'info.

Mon code est devenu
Bloc de code:
repeat
    set test to integer returned of (do shell script "diskutil list | grep /Volumes/Backup")
    if (test = 0) then exit repeat
    delay 1
end repeat

do shell script "/usr/sbin/diskutil unmount /Volumes/Backup > /dev/null"
Mais j'ai toujours le même message que précédemment : "La commande s’est arrêtée avec un état non nul." tout en surlignant la partie do shell script "diskutil list | grep /Volumes/Backup".

C'est donc dans mon code que se situe le problème.

Appel aux applescripters de tous poils ... ;)
 
zacromatafalgar a dit:
Essaye sans le "integer returned"
Bloc de code:
set test to (do shell script "diskutil list | grep /Volumes/Backup")
Malheureusement, j'ai le même résultat : La commande s'est terminée avec un résultat non nul.

J'ai trouvé ça sur le net :
All shell commands return an integer status when they finish: zero means success; anything else means failure. If the script exits with a non-zero status, do shell script throws an AppleScript error with the status as the error number. (The man page for a command should tell you what status codes it can return. Most commands simply use 1 for all errors.) If the script printed something to the standard error stream, that text becomes the error message in AppleScript. If there was no error text, the normal output (if any) is used as the error message.
Mais ça ne m'avance pas beaucoup : La commande diskutil fonctionne bien dans un terminal et pas dans le script. Et évidemment, la commande "man diskutil" ne donne aucune information sur les valeurs retournées par la commande. Je ne peux que supposer que la commande a échoué et me renvoie 1. C'est pourquoi elle a échoué que je cherche.
 
Salut.:)

Dans un (do shell script) quand la commande grep ne trouve rien le script re&#231;oit l'erreur "La commande s&#8217;est arr&#234;t&#233;e avec un &#233;tat non nul." sinon il retourne une ou plusieurs lignes qui contient le texte recherch&#233; par grep.

Essaie ce script, ici, il fonctionne.
Bloc de code:
repeat
	try
		do shell script "/usr/sbin/diskutil list | /usr/bin/grep disk1s1" -- cette ligne retourne une erreur , si grep ne trouve rien
		exit repeat
	end try
	delay 2
end repeat
delay 2
do shell script "/usr/sbin/diskutil unmountDisk /dev/disk1s1 > /dev/null 2>&1 &"

Editer :
unmountDisk est pour tout le disque ,unmount est pour une partition sur le disque
 
Merci &#224; toi Mac_jac, &#231;a marche parfaitement ici aussi.

Juste une petite question : &#224; quoi sert le 2>&1 & &#224; la fin de la commande ?
 
Salut

dLeu a dit:
Juste une petite question : &#224; quoi sert le 2>&1 & &#224; la fin de la commande ?

2>&1 : cela supprime le stderr.
&#199;a redirige le stderr dans le stdout , comme stdout est supprim&#233; par /dev/null ,donc le stderr est supprim&#233; lui aussi. cela &#233;vite d'avoir l'erreur "Volume failed to unmount" m&#234;me si le disque est &#233;ject&#233;.

Le dernier "&' : cela ex&#233;cute la commande dans le background.
 
Eh bien, merci encore pour toutes ces explications claires, précises et surtout bien utiles.

A +

Didier