1

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
  • Do you want to start a daemon (assuming from /etc/init.d/)? You should start it as a service in such a case, not using cron. askubuntu.com/questions/19320/how-to-enable-or-disable-services – Melebius Jul 27 '17 at 12:05
  • When I start it like service:sudo service unicorn_appname start, it gives me an error: /etc/init.d/unicorn_appname: 1: eval: bundle: not found – Alex Zakruzhetskyi Jul 27 '17 at 12:15
  • You should show us the code in /etc/init.d/unicorn_myapp. The code you’ve posted till now does not contain any call to /usr/bin/env. – Melebius Jul 27 '17 at 13:34
  • unicorn_myapp is a symlink to unicorn_init.sh that is located in the rails project in app/config If you need the content of unicorn_init.sh, I'll add it to the post. – Alex Zakruzhetskyi Jul 27 '17 at 14:04
0

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)

0

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
  • Still, it gives me the same error: /usr/bin/env: ‘ruby’: No such file or directory – Alex Zakruzhetskyi Jul 27 '17 at 12:27
  • Which solution did you try? – Ziazis Jul 27 '17 at 12:31
  • The first one you wrote. EDIT: Tried the second solution, but the result didn't change. – Alex Zakruzhetskyi Jul 27 '17 at 12:32
  • 1
    Sounds more like an issue in your ruby script then cronjob issue. You can try the same with just a simple "echo $PATH" instead of your script and see what the PATH variable consists of or create a hello world ruby script and try piping that ouput into a file. – Ziazis Jul 27 '17 at 12:47
  • The output of echo $PATH: /root/bin:/root/.local/bin:/root/.rbenv/plugins/ruby-build/bin:/root/.rbenv/shims:/root/.rbenv/bin:/usr/local/rvm/gems/ruby-1.9.2-p180/bin:/usr/local/rvm/gems/ruby-1.9.2-p180@global/bin:/usr/local/rvm/rubies/ruby-1.9.2-p180/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/rvm/gems/ruby-1.9.2-p180/bin:/snap/bin:/usr/local/rvm/bin – Alex Zakruzhetskyi Jul 27 '17 at 12:54

Your Answer

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

Not the answer you're looking for? Browse other questions tagged or ask your own question.