Depuis des années, nous avons un script de surveillance/contrôle de processus dans le cadre de notre application. Le comportement par défaut du script est de se démoniser. Souvent, le script est lancé, par nécessité, par des utilisateurs non privilégiés. Pour des raisons que je ne développerai pas, nous devons garder à la fois le script et ce comportement.Comment démoniser un script non-privilégié dans OSX Yosemite 10.10.3+
Sur OSX systèmes, nous avons toujours eu le script lui-même redémarrer en arrière-plan via le /usr/libexec/StartupItemContext script de lancement fourni par Apple. Ceci place notre processus dans le contexte bootstrap Mach StartupItem plutôt que dans le contexte bootstrap de connexion. Cela est nécessaire car sans ce changement de contexte, si et quand l'utilisateur se déconnecte, ce qui est souvent nécessaire, le script perd l'accès aux services d'annuaire, getpwuid(), services DNS, etc. Les lignes internes originales qui ont démonisé le script comme celui-ci (en Perl):
my $cmd = "/usr/libexec/StartupItemContext myscript @Commandline > logs/startup 2>&1" ;
system("$cmd &") ;
exit 0 ;
Lorsque OSX Yosemite est sorti, que scénario StartupItemContext a disparu, donc nous sommes passés à diriger l'invocation de launchctl:
my $cmd = "/usr/launchctl bsexec/myscript @Commandline > logs/startup 2>&1" ;
system("$cmd &") ;
exit 0 ;
Avec la récente OSX 10.10.3 cependant, mise à niveau, le bsexec sous-commande de launchctl exige tout à coup les privilèges root:
% launchctl bsexec
This subcommand requires root privileges: bsexec
%
Cela crée pour nous le problème Showstopper que les utilisateurs non privilégiés ne peuvent plus obtenir notre script de surveillance/contrôle pour se démoniser.
Il semble que Glassfish has encountered this problem et adressée avec a patch qui remplace
/bin/launchctl bsexec/
avec
nohup
Cela peut fonctionner pour la mise en œuvre Glassfish, mais je ne pense pas que pour nous. Nonobstant le fait que je ne le comprenne pas - pourquoi un simple blocage de SIGHUP empêcherait un processus dans un contexte de bootstrap désaffecté de perdre des services - il ne semble pas non plus fonctionner dans nos tests pour tous les services système dont nous avons besoin .
Quelle est la nouvelle façon canonique daemonize un processus sur OSX à partir d'un non-privilégié, Mach « login » contexte d'amorçage, sans perdre l'accès aux services système critiques comme DNS, etc. lorsque l'utilisateur se déconnecte?
Merci beaucoup à @Rob pour l'esquisse informée de la façon de le reconfigurer. Afin de créer une marge de manœuvre pour poursuivre dans cette voie, connaissez-vous une esquive à court terme pour notre prochain délai de publication (d'une semaine), autre que le _sudo_ qui brise les exigences? Par exemple, [old technical notes] (https://developer.apple.com/library/mac/technotes/tn2083/_index.html) suggère qu'il existe un contexte bootstrap «utilisateur» en plus du contexte «login». Existe-t-il un moyen de lancer un processus de manière à ce qu'il atterrisse dans un contexte "utilisateur" au lieu de "connexion", et survit donc, espérons-le, à la déconnexion de la session? Nous avons été aveuglés par le changement d'Apple ici, merci – lcikgl
Ce TN est la carte que vous voulez. J'y reviens tout le temps. Je crois que ce que vous regardez est un LaunchAgent non-GUI. Je ne pense pas que ceux-ci survivront à la déconnexion. Tout ce qui "par utilisateur" va vouloir s'arrêter quand l'utilisateur part. Vous pouvez l'essayer en plaçant une plist dans/Library/LaunchAgents. Vous pourriez essayer de forker et de détacher de votre parent (setsid ou peut-être une double-fourchette peut être nécessaire). Il est possible que cela puisse vous protéger de la déconnexion. –