1 votes

Démarrer le démon pour l'application NodeJS ne fonctionne pas au redémarrage

J'ai créé le démon de lancement ci-dessous pour exécuter un programme nodejs au démarrage (tiddlywiki dans ce cas) :

        Debug

        StandardOutPath
        /tmp/tiddlywiki.stdout
        StandardErrorPath
        /tmp/tiddlywiki.stderr
        Label
        com.activescott.tiddlywiki
        OnDemand

        RunAtLoad

        KeepAlive

        inetdCompatibility

            Wait

        EnvironmentVariables

            PATH
            /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:

        ProgramArguments

            /Volumes/minidata/Dropbox/tiddlywiki/node_modules/.bin/tiddlywiki
            /Volumes/minidata/Dropbox/tiddlywiki/wiki
            --listen
            credentials=creds.csv
            writers=scott
            readers=scott
            port=443
            host=0.0.0.0
            tls-key=key.pem
            tls-cert=server.crt

Le fichier est nommé com.activescott.tiddlywiki.plist et il se trouve dans le dossier /Library/LaunchDaemons/.

Si je le charge avec la commande :

sudo launchctl load -Fw /Library/LaunchDaemons/com.activescott.tiddlywiki.plist

Je le lance avec la commande ci-dessous et il démarrera et fonctionnera correctement - il ne redémarrera simplement pas automatiquement lorsque l'ordinateur redémarre :

sudo launchctl start com.activescott.tiddlywiki

Remarque, cela prend environ ~20s pour démarrer complètement (par exemple répondre sur un port et écrire sur stdout).

Je suis sur Mac OS X, 10.13.6 avec BuildVersion 17G13035

Mise à jour :

Après un redémarrage, j'ai remarqué que la sortie de sudo launchctl list com.activescott.tiddlywiki montre LastExitStatus comme 19968 . Cette valeur affichera 0 si je le démarre avec launchctl. Voici la sortie complète :

{
        "StandardOutPath" = "/tmp/tiddlywiki.stdout";
        "LimitLoadToSessionType" = "System";
        "StandardErrorPath" = "/tmp/tiddlywiki.stderr";
        "Label" = "com.activescott.tiddlywiki";
        "TimeOut" = 30;
        "OnDemand" = true;
        "LastExitStatus" = 19968;
        "Program" = "/Volumes/minidata/Dropbox/tiddlywiki/node_modules/.bin/tiddlywiki";
        "ProgramArguments" = (
                "/Volumes/minidata/Dropbox/tiddlywiki/node_modules/.bin/tiddlywiki";
                "/Volumes/minidata/Dropbox/tiddlywiki/wiki";
                "--listen";
                "credentials=creds.csv";
                "writers=scott";
                "readers=scott";
                "port=443";
                "host=0.0.0.0";
                "tls-key=key.pem";
                "tls-cert=server.crt";
        );
};

0 votes

Où spécifiez-vous la clé Program? c'est-à-dire, quel est le programme que vous exécutez et où se trouve-t-il?

1 votes

Avez-vous également essayé d'exécuter cela avec un script plutôt que d'avoir plusieurs arguments de programme. Il y a aussi un paramètre de montage, assurez-vous de vérifier si le chemin du volume existe. Essayez également avec le paramètre de maintien suivant : KeepAlive SuccessfulExit Ce modèle semble fonctionner, essayez également avec ceci : gist.github.com/lordlycastle/0efb8a10d2ccb7a90e4e5b1c9749ccf‌​2

1 votes

Veuillez poster la sortie de grep -F com.activescott.tiddlywiki /var/log/system.log après avoir redémarré. (Les dernières lignes de la sortie devraient suffire.)

1voto

En supposant que votre application peut être exécutée dans le Terminal, en créant un programme AppleScript (en utilisant Script Editor) contenant les commandes que vous exécuteriez dans le terminal et en exportant ce programme sous forme d'une Application exécutable, en le plaçant dans votre répertoire /Applications/, vous pouvez créer votre lanceur de programme.

Il y a une réponse utile sur l'utilisation de do shell script en AppleScript ici.

Exemple AppleScript: Exécution de hdiutil pour monter un paquet d'image creuse en tant que disque de sauvegarde Time Machine

do shell script "hdiutil attach /Volumes/NewVolumeD/TimeMachine.sparsebundle"

Ensuite, en naviguant dans Préférences Système > Utilisateurs et groupes > (votre compte) > Éléments d'ouverture de session, en déverrouillant le menu des paramètres et en utilisant le bouton + en bas à gauche pour sélectionner votre application lanceur depuis Applications. Ce lanceur s'exécutera maintenant à l'ouverture de session, cochez Masquer pour éviter les messages indésirables.

Alternativement, vous pourriez créer un script zsh ou bash et demander à AppleScript d'exécuter le script shell (en donnant son chemin absolu) au lieu de spécifier chaque commande dans AppleScript lui-même.

ÉDIT: Au lieu d'utiliser les Éléments d'ouverture de session, vous pouvez placer le Bundle d'Application dans /Library/StartupItems (quoique déconseillé) si vous voulez qu'il se lance au démarrage au lieu de la connexion.

0 votes

Merci pour l'idée. Certainement pas vouloir compter sur Applescript pour démarrer un service non-UI cependant. De plus, je ne sais même pas si Applescript peut s'exécuter au démarrage (mais pas à la connexion)

1 votes

Tout va bien! Je ne trouve pas vraiment de problème avec AppleScript et les programmes non-UI car il affiche toujours la sortie stderr sous forme de boîte de dialogue, ce qui est suffisant pour mes besoins. Mais oui, launchd serait toujours la meilleure option pour quelque chose de plus complexe.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X