我通过此mongo doc创建服务。
我的配方中有这个通过模板安装服务:
service 'disable-transparent-hugepages' do
supports :restart => true, :start => true, :stop => true, :reload => true
action :nothing
end
template 'disable-transparent-hugepages' do
path '/etc/init.d/disable-transparent-hugepages'
source 'disable-transparent-hugepages.erb'
owner 'root'
group 'root'
mode '0755'
notifies :enable, 'service[disable-transparent-hugepages]'
notifies :start, 'service[disable-transparent-hugepages]'
end
当我多次运行配方时,它会将init.d脚本拉到正确的位置,但如果我检查它的状态,我会看到:
在我确认安装后,我在配方中添加了一行,就像正常启动服务一样:
service 'disable-transparent-hugepages' do
action :start
end
但它还没有开始。
为什么没有厨师开始服务?
编辑:好的,所以我发现this SO question说我的问题可能是我需要init.d脚本(在mongo doc的链接中找到)需要以非0返回代码退出。我不确定如何在检查状态时让脚本返回非零代码。
答案 0 :(得分:2)
这与脚本支持命令的假设有关。
引用关于supports
service
resource关于supports
财产的主厨文档(强调最后一行是我的):
status
Ruby类型:哈希控制chef-client尝试方式的属性列表 管理服务:: restart,:reload,:status。对于:重启, init脚本或其他服务提供者可以使用restart命令;如果 :未指定restart,chef-client尝试停止然后 开始服务。用于:重新加载,init脚本或其他服务 provider可以使用reload命令。对于:status,init脚本或 其他服务提供商可以使用status命令来确定是否 服务正在运行;如果:未指定status,则为chef-client 尝试将service_name与进程表匹配为 正则表达式,除非将模式指定为参数 属性。默认值:{:restart => false,:reload =>假, :status =>对于所有平台都是假的(除了Red Hat平台 系列,默认为{:restart => false,:reload =>假,强> :status =>是的。)
当true
为0
时,提供程序会尝试调用它,如果它返回start
该服务应该正在运行。
根据您提供的链接,脚本仅支持service 'disable-transparent-hugepages' do
supports :restart => false, :start => true, :stop => false, :reload => false, :status => false
action :start
end
,因此在使用参数状态调用时返回0。
解决此问题的一种方法是使用更精确的服务定义,如下所示:
status)
if [ -d /sys/kernel/mm/transparent_hugepage ]; then
thp_path=/sys/kernel/mm/transparent_hugepage
elif [ -d /sys/kernel/mm/redhat_transparent_hugepage ]; then
thp_path=/sys/kernel/mm/redhat_transparent_hugepage
else
return 0
fi
re='^(0|no)$'
return [[ $(cat ${thp_path}/khugepaged/defrag) =~ $re ]]
;;
另一种方法是修复init脚本以实现status命令,如果文件具有正确的内容则返回0,否则返回1。
我认为(未经测试),这条线路上的某些东西可以作为状态:
{{1}}
我的意见:
由于它不是一个真正的服务,我会直接管理这些文件,而不是使用伪服务。