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?
You are best advised to configure your code to run as a service. Several wrappers available, for example:
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
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
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
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.