【发布时间】:2015-04-21 17:33:00
【问题描述】:
多年来,我们一直将流程监控/控制脚本作为我们应用程序的一部分。脚本的默认行为是守护自己。通常,脚本是由非特权用户启动的。由于我不会详细说明的原因,我们需要保留脚本和此行为。
在 OSX 系统上,我们通常通过 Apple 提供的 /usr/libexec/StartupItemContext 启动脚本让脚本在后台自行重启。这将我们的进程置于 Mach StartupItem 引导上下文而不是登录引导上下文中。这是必要的,因为如果没有上下文切换,如果用户注销时(这通常也是必要的),脚本将失去对目录服务、getpwuid()、DNS 服务等的访问权限。守护脚本的原始内部行基本上看起来像这样(在 perl 中):
my $cmd = "/usr/libexec/StartupItemContext myscript @Commandline > logs/startup 2>&1" ;
system( "$cmd &") ;
exit 0 ;
OSX Yosemite出来后,那个StartupItemContext脚本消失了,所以我们切换到直接调用launchctl:
my $cmd = "/usr/launchctl bsexec / myscript @Commandline > logs/startup 2>&1" ;
system( "$cmd &") ;
exit 0 ;
然而,随着最近的 OSX 10.10.3 升级,launchctl 的 bsexec 子命令突然需要 root 权限:
% launchctl bsexec
This subcommand requires root privileges: bsexec
%
这给我们带来了一个令人瞩目的问题,即非特权用户无法再让我们的监控/控制脚本自行守护进程。
似乎Glassfish has encountered this problem 并用a patch 代替了
/bin/launchctl bsexec /
与
nohup
这可能适用于 Glassfish 实施,但我认为不适用于我们。尽管我不明白这一点——即为什么简单地阻止 SIGHUP 会阻止已停用的登录引导上下文中的进程丢失服务——但它似乎也不适用于我们需要的所有系统服务的测试.
什么是在 OSX 上从非特权的 Mach“登录”引导上下文开始守护进程的新规范方法,而不会失去对关键系统服务(如 DNS 等)的访问权限。用户退出?
【问题讨论】:
标签: macos daemon osx-yosemite launchd mach