Glam Prestige Journal

Bright entertainment trends with youth appeal.

When crontab tries to execute the script:

@reboot sh /home/username/unicorn_start.sh > /home/username/unicorn_start.out 2>&1

It creates me a log file with the following content: /usr/bin/env: ‘ruby’: No such file or directory.

This is what I have in unicorn_start.sh:

#!/bin/bash
PATH="$PATH:/usr/local/rvm/gems/ruby-1.9.2-p180/bin"
/etc/init.d/unicorn_myapp start

If I execute unicorn_myapp or unicorn_start.sh manually, everything works fine. As I understand, I need to add an additional path to $PATH variable. What is the way of doing it? Thanks ahead.

EDIT:

unicorn_init.sh:

#!/bin/sh
### BEGIN INIT INFO
# Provides: unicorn
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Manage unicorn server
# Description: Start, stop, restart unicorn server for a specific application.
### END INIT INFO
set -e
# Feel free to change any of the following variables for your app:
TIMEOUT=${TIMEOUT-60}
APP_ROOT=/home/username/appname
PID=$APP_ROOT/tmp/pids/unicorn.pid
CMD="cd $APP_ROOT; bundle exec unicorn -D -c $APP_ROOT/config/unicorn.rb -E production"
AS_USER=root
set -u
OLD_PIN="$PID.oldbin"
sig () { test -s "$PID" && kill -$1 `cat $PID`
}
oldsig () { test -s $OLD_PIN && kill -$1 `cat $OLD_PIN`
}
run () { if [ "$(id -un)" = "$AS_USER" ]; then eval $1 else su -c "$1" - $AS_USER fi
}
case "$1" in
start) sig 0 && echo >&2 "Already running" && exit 0 run "$CMD" ;;
stop) sig QUIT && exit 0 echo >&2 "Not running" ;;
force-stop) sig TERM && exit 0 echo >&2 "Not running" ;;
restart|reload) sig HUP && echo reloaded OK && exit 0 echo >&2 "Couldn't reload, starting '$CMD' instead" run "$CMD" ;;
upgrade) if sig USR2 && sleep 2 && sig 0 && oldsig QUIT then n=$TIMEOUT while test -s $OLD_PIN && test $n -ge 0 do printf '.' && sleep 1 && n=$(( $n - 1 )) done echo if test $n -lt 0 && test -s $OLD_PIN then echo >&2 "$OLD_PIN still exists after $TIMEOUT seconds" exit 1 fi exit 0 fi echo >&2 "Couldn't upgrade, starting '$CMD' instead" run "$CMD" ;;
reopen-logs) sig USR1 ;;
*) echo >&2 "Usage: $0 <start|stop|restart|upgrade|force-stop|reopen-logs>" exit 1 ;;
esac
4

3 Answers

The default PATH crontab is using is "only" /usr/bin:/bin, however you can adjust it.

Instead of writing the things in that script try adding it directly into the crontab command:

@reboot PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/rvm/gems/ruby-1.9.2-p180/bin"; /etc/init.d/unicorn_myapp start > /home/username/unicorn_start.out 2>&1

You can also add the path variable above every cronjob so it's applicable to every task you put in there:

 PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/rvm/gems/ruby-1.9.2-p180/bin" # # * * * * * myjob.sh @reboot /home/username/unicorn_start.sh > /home/username/unicorn_start.out 2>&1
8

If you use the which command you should be able to see where your ruby executable is located e.g

which ruby
/usr/bin/ruby

The you could add that path to the $PATH variable to straight to the crontab (not sure what best practice may dictate but has worked for me in the past)

I faced same issue with following details

Ruby was installed on system

which ruby returned /usr/local/bin/ruby but if is try to run any script from cron it was throwing error /usr/bin/env: ‘ruby’: No such file or directory

A little investigation revealed that env was trying to load ruby binary form /usr/bin/ruby even though /usr/local/bin/ was in the $PATH env variable. So i created a soft link.

ln -s /usr/local/bin/ruby /usr/bin/ruby

Now scripts can work from cron as well.

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy