我有一个要使用 Chef 部署的 Java 应用程序。我希望它启动,并允许 Chef 客户端退出。但是,无论我如何运行它,chef-client 似乎都会等待命令完成。
我努力了:
javaw
使用execute
资源执行- 执行
start
- 执行
start /B
- 创建批处理脚本并使用
start
和运行该脚本start /B
有没有办法可以运行 Java 程序而不阻塞 chef-client?
答案1
编辑:下面的答案适用于 Linux,不适用于 Windows。这可能不是你需要的,但由于我在写它时没有注意到这是一个 Windows 问题,所以我将它留给潜在的未来读者。
在 Linux 上可以这样做:
我想您可以编写一个 bash 脚本并将其作为服务运行。我正在使用daemon
包来执行此操作。以下是您可以开始使用的示例配方:
# the package that lets you easily define new services
package "daemon"
# script file used by service to launch your java program
file "/my/path/run_script.cmd" do
content "java --flag1 --flag2 -jar /my/program.jar\n"
end
# setup the service (based on the script above),
# start it, and make it start at boot
cookbook_file '/etc/init.d/myservice' do
source 'etc_initd_myservice'
end
service "myservice" do
supports :restart => true, :start => true, :stop => true, :reload => true
action [:enable]
end
请注意,您需要添加一个名为etc_initd_myservice
“食谱”的文件。您可以使用这个答案作为此文件的基础。这是使用“守护进程”包将脚本作为服务运行的文件。
还,以下问题如果您在定义服务和在同一配方中创建其 init.d 脚本时遇到问题,则可能包含相关信息。
答案2
我最终通过将程序设为服务并以此方式运行来解决这个问题。Windows 服务需要更改代码或服务包装器。 亚美尼亚联合社会主义者对我来说很管用。YAJSW 很容易设置,因为它包含脚本来帮助生成配置、安装为服务以及运行服务。在 chef 配方中,我包括在测试机器上生成的配置文件,并使用内置脚本安装和运行服务。
其中一个问题是确保运行该服务的用户可以运行服务。