多年来,我们一直将流程监控/控制脚本作为我们应用程序的一部分。脚本的默认行为是守护自己。通常,脚本是由非特权用户启动的。由于我不会详细说明的原因,我们需要保留脚本和此行为。
在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
%
这为我们创造了一个令人瞩目的问题,即非特权用户无法再让我们的监视/控制脚本自行守护进程。
看起来遇到了这个问题,并通过替换的补丁解决了这个问题
/bin/launchctl bsexec /
和
nohup
这可能适用于 Glassfish 实现,但我不认为我们适合。尽管我不明白这一点 - 即为什么简单的 SIGHUP 阻塞会阻止退役登录引导上下文中的进程丢失服务 - 它似乎也不适用于我们需要的所有系统服务的测试.
什么是在OSX上从非特权的马赫“登录”引导上下文开始守护进程的新规范方法,而不会在用户注销时失去对关键系统服务(如 DNS 等)的访问权限?