how to run a java program at background from chef recipe

坚强是说给别人听的谎言 提交于 2019-11-27 19:05:15

问题


I am a chef rookie. I want to create a recipe to run a jar at background.

bash 'run_jar' do
    code <<-EOH
    wget https://github.com/kiwiwin/jar-repo/releases/download/kiwi/helloworld-1.0.jar -O hello.jar
    java -jar hello.jar &
    EOH
end

The helloworld-1.0.jar is a program first print "Hello World", then execute a while(true) loop.

I expect when I login to the chef-client machine. It should indicate there is a jar running using "jps" command. But there is no such jar running.

And I can see the hello.jar is downloaded which indicates the code block has been executed already.

What's wrong with this recipe?


回答1:


You are best advised to configure your code to run as a service. Several wrappers available, for example:

  • http://wrapper.tanukisoftware.com/doc/english/app-hello-world-server.html

Once this is done you can configure chef to manage the new service:

service "myapp_service" do
  supports :status => true, :restart => true
  start_command "/usr/lib/myapp/bin/myapp start"
  restart_command "/usr/lib/myapp/bin/myapp restart"
  status_command "/usr/lib/myapp/bin/myapp status"
  action [ :enable, :start ]
end



回答2:


You should use remote_file resource to get the file instead of using wget in a bash here document block.

Debug is very helpful, enable it if you are not sure ;-) (suppose you are using chef-solo)

chef-solo -c solo.rb -j node.json -l debug

NOTE: I recommend downloading the file to Chef::Config[:file_cache_path] or /tmp.

I was able to achieve what you want using remote_file. The recipe looks like below:

 temp=Chef::Config[:file_cache_path]

 remote_file "#{Chef::Config[:file_cache_path]}/hello.jar" do
     source "https://github.com/kiwiwin/jar-repo/releases/download/kiwi/helloworld-1.0.jar"
     mode 00644
 end

 bash 'run_jar' do
     code <<-EOF
       /opt/jdk1.6.0_37/bin/java -jar #{temp}/hello.jar > #{temp}/hello.log 2>&1 &
     EOF
 end

Example run on an EC2 test box (performance sucks...):

# chef-solo -c solo.rb -j node.json -l debug
[2013-08-26T02:51:08+00:00] INFO: Forking chef instance to converge...
[2013-08-26T02:51:08+00:00] DEBUG: Fork successful. Waiting for new chef pid: 18991
[2013-08-26T02:51:08+00:00] DEBUG: Forked instance now converging
Starting Chef Client, version 11.6.0
[2013-08-26T02:51:13+00:00] INFO: *** Chef 11.6.0 ***
[2013-08-26T02:51:37+00:00] DEBUG: Building node object for cloud.terry.im
[2013-08-26T02:51:37+00:00] DEBUG: Extracting run list from JSON attributes provided on command line
[2013-08-26T02:51:37+00:00] INFO: Setting the run_list to ["recipe[main]"] from JSON
[2013-08-26T02:51:37+00:00] DEBUG: Applying attributes from json file
[2013-08-26T02:51:37+00:00] DEBUG: Platform is ubuntu version 12.04
[2013-08-26T02:51:37+00:00] INFO: Run List is [recipe[main]]
[2013-08-26T02:51:37+00:00] INFO: Run List expands to [main]
[2013-08-26T02:51:37+00:00] INFO: Starting Chef Run for cloud.terry.im
[2013-08-26T02:51:37+00:00] INFO: Running start handlers
[2013-08-26T02:51:37+00:00] INFO: Start handlers complete.
[2013-08-26T02:51:37+00:00] DEBUG: No chefignore file found at /tmp/chef/cookbooks/chefignore no files will be ignored
Compiling Cookbooks...
[2013-08-26T02:51:37+00:00] DEBUG: Cookbooks to compile: [:main]
[2013-08-26T02:51:37+00:00] DEBUG: Loading Recipe main via include_recipe
[2013-08-26T02:51:37+00:00] DEBUG: Found recipe default in cookbook main
[2013-08-26T02:51:37+00:00] DEBUG: Loading from cookbook_path: /tmp/chef/cookbooks
Converging 2 resources
[2013-08-26T02:51:37+00:00] DEBUG: Converging node cloud.terry.im
Recipe: main::default
  * remote_file[/var/chef/cache/hello.jar] action create[2013-08-26T02:51:37+00:00] INFO: Processing remote_file[/var/chef/cache/hello.jar] action create (main::default line 3)
[2013-08-26T02:51:37+00:00] DEBUG: touching /var/chef/cache/hello.jar to create it
[2013-08-26T02:51:37+00:00] INFO: remote_file[/var/chef/cache/hello.jar] created file /var/chef/cache/hello.jar

    - create new file /var/chef/cache/hello.jar[2013-08-26T02:51:37+00:00] DEBUG: remote_file[/var/chef/cache/hello.jar] checking for changes
[2013-08-26T02:51:37+00:00] DEBUG: Cache control headers: {}
[2013-08-26T02:51:37+00:00] DEBUG: Sending HTTP Request via GET to github.com:443/kiwiwin/jar-repo/releases/download/kiwi/helloworld-1.0.jar
[2013-08-26T02:51:38+00:00] DEBUG: Streaming download from https://github.com/kiwiwin/jar-repo/releases/download/kiwi/helloworld-1.0.jar to tempfile /tmp/chef-rest20130826-18991-11kv5ag
[2013-08-26T02:51:38+00:00] DEBUG: Following redirect 1/10
[2013-08-26T02:51:38+00:00] DEBUG: Sending HTTP Request via GET to s3.amazonaws.com:443/github-cloud/releases/12257402/d34edcec-0ba1-11e3-9ef0-268967c7e46f.jar
[2013-08-26T02:51:39+00:00] DEBUG: Streaming download from https://s3.amazonaws.com/github-cloud/releases/12257402/d34edcec-0ba1-11e3-9ef0-268967c7e46f.jar?response-content-disposition=attachment%3B%20filename%3Dhelloworld-1.0.jar&AWSAccessKeyId=AKIAISTNZFOVBIJMK3TQ&Expires=1377485552&Signature=ahoXNIhegXTdEvUE0FoimC34x%2Bg%3D to tempfile /tmp/chef-rest20130826-18991-1ojysmn
[2013-08-26T02:51:39+00:00] DEBUG: reading modes from /var/chef/cache/hello.jar file
[2013-08-26T02:51:39+00:00] DEBUG: applying mode = 640, uid = 0, gid = 0 to /tmp/chef-rest20130826-18991-1ojysmn
[2013-08-26T02:51:39+00:00] DEBUG: moving temporary file /tmp/chef-rest20130826-18991-1ojysmn into place at /var/chef/cache/hello.jar
[2013-08-26T02:51:39+00:00] INFO: remote_file[/var/chef/cache/hello.jar] updated file contents /var/chef/cache/hello.jar

    - update content in file /var/chef/cache/hello.jar from none to 9d1706
        (new content is binary, diff output suppressed)[2013-08-26T02:51:39+00:00] DEBUG: found current_mode == nil, so we are creating a new file, updating mode
[2013-08-26T02:51:39+00:00] DEBUG: found current_mode == nil, so we are creating a new file, updating mode
[2013-08-26T02:51:39+00:00] DEBUG: found target_uid == nil, so no owner was specified on resource, not managing owner
[2013-08-26T02:51:39+00:00] DEBUG: found target_gid == nil, so no group was specified on resource, not managing group
[2013-08-26T02:51:39+00:00] DEBUG: found target_uid == nil, so no owner was specified on resource, not managing owner
[2013-08-26T02:51:39+00:00] DEBUG: found target_gid == nil, so no group was specified on resource, not managing group
[2013-08-26T02:51:39+00:00] DEBUG: found current_mode == nil, so we are creating a new file, updating mode
[2013-08-26T02:51:39+00:00] INFO: remote_file[/var/chef/cache/hello.jar] mode changed to 644

    - change mode from '' to '0644'[2013-08-26T02:51:39+00:00] DEBUG: selinux utilities can not be found. Skipping selinux permission fixup.


  * bash[run_jar] action run[2013-08-26T02:51:39+00:00] INFO: Processing bash[run_jar] action run (main::default line 8)
[2013-08-26T02:51:39+00:00] DEBUG: Platform ubuntu version 12.04 found
[2013-08-26T02:51:41+00:00] INFO: bash[run_jar] ran successfully

    - execute "bash"  "/tmp/chef-script20130826-18991-jvx1bi"

[2013-08-26T02:51:41+00:00] INFO: Chef Run complete in 3.688815399 seconds
[2013-08-26T02:51:41+00:00] INFO: Running report handlers
[2013-08-26T02:51:41+00:00] INFO: Report handlers complete
Chef Client finished, 2 resources updated
[2013-08-26T02:51:44+00:00] DEBUG: Forked child successfully reaped (pid: 18991)
[2013-08-26T02:51:44+00:00] DEBUG: Exiting
root@cloud:/tmp/chef# cat /var/chef/cache/hello.log
Hello World



回答3:


I think it's better to use a tool like supervisor to it. I'm using the poise supervisor recipe, you can read about it here.

here is a sample code:

include_recipe "supervisor"

service "supervisor" do
  supports :status => true, :restart => true
  action [:enable, :start]
end

# configure supervisor
supervisor_service "sample-java-app" do
  command   "java -jar hello.jar"
  directory <path-to-folder>
  environment <environment-hash>
  action [:enable, :start]
  autostart true
  autorestart true
  stdout_logfile /var/log/sample-java-app.log
  redirect_stderr true
  user root
  notifies :restart, 'service[supervisor]', :delayed
end

you can control your service with the following commands:

$> supervisorctl start/stop/restart sample-java-app


来源:https://stackoverflow.com/questions/18414090/how-to-run-a-java-program-at-background-from-chef-recipe

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!