Annuler un "shutdown"
Old Salt
Membre
Bonjour à tous,
J'essaie d'annuler (dans certains cas) une extinction manuelle ou programmée de l'ordinateur.
J'ai lu que l'on pouvait annuler l'extinction en faisant "sudo killall shutdown".
Mon application reçoit bien la notification "NSWorkspaceWillPowerOffNotification" et utilise alors le code suivant :
Mais le Mac s'éteint quand même...
Auriez-vous une idée ? Merci
J'essaie d'annuler (dans certains cas) une extinction manuelle ou programmée de l'ordinateur.
J'ai lu que l'on pouvait annuler l'extinction en faisant "sudo killall shutdown".
Mon application reçoit bien la notification "NSWorkspaceWillPowerOffNotification" et utilise alors le code suivant :
NSString *admin = [NSString stringWithString:@"oldsalt"];<br /> NSMutableString *source0;<br /> source0 = [NSMutableString stringWithString:@"do shell script \"sudo /usr/bin/killall shutdown\" password "];<br /> [source0 appendString:admin];<br /> [source0 appendString:@" with administrator privileges"];<br /> NSAppleScript *script0 = [[NSAppleScript alloc] initWithSource:source0];<br /> [script0 executeAndReturnError:nil];<br /> [script0 release];<br />
Mais le Mac s'éteint quand même...
Auriez-vous une idée ? Merci
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Non je suis sûr qu'il y a une méthode plus propre et officielle pour que si ton application demande à être quittée suite à une demande de shutdown elle annule ce shutdown. J'ai jamais cherché car jamais eu à faire mais ça doit sûrement exister.
Reste à ne retourner ça que si tu as reçu une notif de shutdown juste avant et que tu veux que ce soit le cas où il interdise ce shutdown, et dans les autres cas retourner NSTerminateNow...
A tester en tout cas
1/ Je ne mets pas de guillemets autour du mot de passe, car j'envoie un objet NSString, pas le mot lui-même. Du moins, j'avais constaté qu'il fallait faire comme ça lors de mes tests pour envoyer un mot de passe.
2/ Avec NSTask, je n'ai pas trouvé comment envoyer le mot de passe...
3/ Je vais tester avec "NSTerminateCancel"
Au final tel que tu construit ta chaà®ne source0, cela va donner au final (tu peux le constater si tu fais un [tt]NSLog(@source : %@",source0);[/tt]) : Or si tu demandes à AppleScript d'exécuter ça, il va identifier oldsalt comme une variable et non comme une chaà®ne littérale (testes en collant cette chaà®ne dans l'Editeur Applescript tu verras)
A force d'échapper des chaà®nes dans des chaà®nes... on s'y perd
Au passage ton stringWithString ne sert à rien, et un stringWithFormat aurait également été plus efficace (même si une NSMutableString est tout à fait valable hein mais bon)
NSTerminateCancel n'a pas l'effet escompté; cela empêche bien l'application de quitter si je fais un "Cmd-Q", mais ça n'interdit pas l'extinction du Mac
Je viens de tester en faisant un AppleScript indépendant de mon appli :
Et cela fonctionne parfaitement, pas besoin de guillemets.
Par contre si je rajoute cette ligne, immédiatement à la suite des précédentes :
Elle est sans effet et n'empêche pas l'extinction.
Est-ce le "sudo /usr/bin/killall shutdown" qui a une erreur quelque part, ou bien qui ne fonctionne pas ? ???
Plus proprement, j'utiliserai NSTerminateLater
Effectivement, une appli peut interdire l'extinction, par example en cas de document non sauvegardé ou de dialogue modal.
Le NSTerminateCancel pouvait être une autre possibilité...
Tu veux dire avec une appli qui demande à sauvegarder son document ?
Je suis bien d'accord, mais à part "killall shutdown" (que je n'arrive pas à faire fonctionner), je ne vois pas d'autre moyen...
1) Normal qu'il n'y ait pas besoin de guillemets dans ton exemple que tu mets directement dans AppleScript puisque dans cet exemple, tu utilises une variable AppleScript pour le nom de l'utilisateur et du mot de passe. D'ailleurs tu mets bien des guillemets autour de "cemoi" et "oldsalt" quand tu définis les valeurs desdites variables !! Alors que dans ton premier exemple où tu construisais ton code source AppleScript tu ne faisais pas comme cela et insérait directement ton mot de passe (via une variable Objective-C, pas AppleScript) dans la chaà®ne... C'est pourtant flagrant, je te dis, fait un NSLog de source0 et copie-colle le résultat dans l'Editeur AppleScript tu vas comprendre c'est pas sorcier
2) Abandonne vraiment le killall shutdown, c'est vraiment un truc crade à faire pour annuler une extinction, c'est quoi cette idée saugrenue ! Si tu commences à essayer des trucs comme ça c'est que tu es sur la mauvaise voie !
3) Si tu veux annuler l'extinction pour qu'une application ait le temps de sauvegarder son document, c'est NSTerminateLater qu'il faut utiliser oui, cette valeur de retour est même précisément faite pour ça !
4) Lis la doc !! Graceful Application Termination y'a tout d'expliqué là dedans ! Ils expliquent comment demander si on veut sauver le document, et justement comment repousser la fermeture de l'application (parce qu'on a demandé explicitement à la quitter ou parce que l'ordinateur est en train de s'éteindre et a demandé lui-même à quitter l'appli), le temps que l'utilisateur puisse sauvegarder son ou ses documents, puis continuer l'extinction une fois qu'il a sauvé son document (ou qu'il a décliné la sauvegarde) ou annuler l'extinction s'il a annulé la fermeture de l'appli.
C'est vraiment cette procédure qu'il faut suivre, et surtout pas essayer des bidouilles avec un killall shutdown (on va croire que tu viens du monde Windows à proposer des solutions crades comme ça :P)
2/ Je veux vraiment annuler une extinction, pour avoir le temps de faire certaines actions, par example lancer un script.
3 et 4/ J'avais lu la doc, mais ça ne s'applique pas à mes besoins.
Là , c'est dur... moi qui utilise des Mac depuis 1985
Hého! C'est quoi ce troll à 2 balles! Je m'insurge! Même sous Windows, quoiqu'en pensent certains, on est un minimum respectueux des Bonnes Pratiques >:(
2/ Je sais que tu veux vraiment annuler l'extinction. C'est pour ça qu'on te propose la solution de NSTerminateLater qui est faite pour ça.
3/ et 4/ Je vois pas en quoi ça ne s'applique pas... Et je plussoie Eaglelouk, le killall c'est vraiment pas la solution et risque même de te provoquer des problèmes.
Oui, entendu.
Bon, je me suis mélangé les pinceaux avec les guillemets dans mes différents tests, ça fait plusieurs jours que je suis dessus, il est temps de m'aérer un peu...
Je vais regarder du côté de NSTerminateLater