I am trying to use run to reload a small program in after_deploy, it
goes something like this:
run <<-CMD
if [[ -f #{shared_path}/pids/program.pid ]]; then
pid=$(cat #{shared_path}/pids/program.pid)
if [[ $pid ]]; then
kill -9 $pid
fi
fi
cd #{release_path}/vendor/cli && ./program.rb"
CMD
When I run cap deploy it sends something like:
* executing "if [[ -f /home/yyy.com/shared/pids/dprogram.pid ]]; then
\n\t\t\tpid=$(cat /home/yyy.com/shared/pids/program.pid)\n\t\t\tif
[[ $pid ]]; then\n\t\t\t\tkill -9 $pid\n\t\t\tfi\n\t\tfi\n\t cd /
home/yyy.com/releases/20070323023501/vendor/cli && ./program.rb"
Which returns something like:
** [out :: www.yyy.com] bash: -c: line 3: syntax error near
unexpected token `then'
** [out :: www.yyy.com] bash: -c: line 3: `
kill -9 $pid\'
command finished
Those commands work if not passed via capistrano. Any ideas on how to
fix this?
run <<-CMD
if [[ -f #{shared_path}/pids/program.pid ]]; then
pid=$(cat #{shared_path}/pids/program.pid) ;
if [[ $pid ]]; then
kill -9 $pid ;
fi ;
fi ;
(cd #{release_path}/vendor/cli && ./program.rb)"
CMD
Try it with the extra ';' and the ( ) around the last command. The whole string has to be parsable by the shell as if you typed it on a single line. The ()'s force a subshell for the last part and keep the && from associating in a way you might not expect (perhaps not now, but later if you add other commands).
You can probably replace -f with -s, "cat" with "<", and remove the 'if/fi' around the kill command.
Heck, you might as well try:
run <<-CMD
if [[ -s #{shared_path}/pids/program.pid ]]; then
kill -9 $(< #{shared_path}/pids/program.pid) ;
fi ;
(cd #{release_path}/vendor/cli && ./program.rb)"
CMD
(but try the small changes first to see for yourself)