cron.sh - expr и команда expr не найдены


Начало: Я никогда раньше не использовал sh.
Мой сервер использует linux RedHat, и каждый раз, когда я запускаю cron.sh, сервер отправляет мне электронное письмо с:

shop/cron.sh: line 45: expr: command not found
shop/cron.sh: line 46: ps: command not found

Строка Cron: /bin/sh /home/mn0198/public_html/shop/cron.sh

Я читал, что это может быть проблемой переносимости, но я даже не знаю, с чего мне следует начать.

#!/bin/sh
#
# Magento
#
# NOTICE OF LICENSE
#
# This source file is subject to the Open Software License (OSL 3.0)
# that is bundled with this package in the file LICENSE.txt.
# It is also available through the world-wide-web at this URL:
# http://opensource.org/licenses/osl-3.0.php
# If you did not receive a copy of the license and are unable to
# obtain it through the world-wide-web, please send an email
# to [email protected] so we can send you a copy immediately.
#
# DISCLAIMER
#
# Do not edit or add to this file if you wish to upgrade Magento to newer
# versions in the future. If you wish to customize Magento for your
# needs please refer to http://www.magento.com for more information.
#
# @category    Mage
# @package     Mage
# @copyright  Copyright (c) 2006-2015 X.commerce, Inc. (http://www.magento.com)
# @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
#
if [ ! "$1" = "" ] ; then
    CRONSCRIPT=$1
else
    CRONSCRIPT=cron.php
fi

MODE=""
if [ ! "$2" = "" ] ; then
    MODE=" $2"
fi

PHP_BIN=`which php`

# absolute path to magento installation
INSTALLDIR=`echo $0 | sed 's/cron\.sh//g'`

#   prepend the intallation path if not given an absolute path
# the following lines are 45 and 46
if [ "$INSTALLDIR" != "" -a "`expr index $CRONSCRIPT /`" != "1" ];then
    if ! ps auxwww | grep "$INSTALLDIR$CRONSCRIPT$MODE" | grep -v grep 1>/dev/null 2>/dev/null ; then
        $PHP_BIN $INSTALLDIR$CRONSCRIPT$MODE &
    fi
else
    if  ! ps auxwww | grep "$CRONSCRIPT$MODE" | grep -v grep | grep -v cron.sh 1>/dev/null 2>/dev/null ; then
        $PHP_BIN $CRONSCRIPT$MODE &
    fi
fi

РЕДАКТИРОВАТЬ - Командный тест

Я запустил их через putty ssh (я не знаю, правильно ли это):

command -v expr >/dev/null 2>&1 || { echo >&2 "not installed.";}
hash expr >/dev/null 2>&1 || { echo >&2 "not installed.";}
type expr >/dev/null 2>&1 || { echo >&2 "not installed.";}


command -v ps >/dev/null 2>&1 || { echo >&2 "not installed.";}
hash ps >/dev/null 2>&1 || { echo >&2 "not installed.";}
type ps >/dev/null 2>&1 || { echo >&2 "not installed.";}

Все они возвращаются not installed

Author: Razorphyn, 2015-11-08

2 answers

Вместо этого используйте php -f cron.php в вашем cron, если ваш хост не поддерживает, ps или expr.

 2
Author: B00MER, 2015-11-09 21:35:01

Простое использование php -f cron.php не делает то, что cron.sh делает.

cron.sh пытается предотвратить несколько экземпляров cron.php, в то время как php -f cron.php просто запускает другой cron, в то время как первый все еще может выполняться.

Это может привести к блокировкам!

Редактировать: Возможно, это обходной путь (Миттвальд предлагает такое решение)?! Вместо этого он использует файл блокировки:

#!/bin/sh
# Compatible versions: 1.9.2.1, 1.9.2.0, 1.9.1.1, 1.9.1.0, 1.9.0.1, 1.8.1.0, 1.8.0.0
lockfile=/tmp/cron.lock
PHP_BIN=/usr/local/bin/php
ABSOLUTE_PATH=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)/$(basename "${BASH_SOURCE[0]}")
INSTALLDIR=${ABSOLUTE_PATH%/*}

function cleanup() {
    for cpid in $(jobs -p); do kill $cpid; done
    rm -f $lockfile
}

trap cleanup 1 2 3 6 9 15

if [ ! -f $lockfile ];then
    echo $$ > $lockfile
else
    exit 0
fi

if [ -n "$1" ] ; then
    CRONSCRIPT=$1
else
    CRONSCRIPT=cron.php
fi

for i in default always; do
        $PHP_BIN $INSTALLDIR/$CRONSCRIPT -m$i 1>/dev/null 2>&1 &
done
wait
rm -f $lockfile

exit 0

Рико

 1
Author: Rico Neitzel, 2015-11-24 21:06:57