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
2 answers
Вместо этого используйте php -f cron.php
в вашем cron, если ваш хост не поддерживает, ps
или expr
.
Простое использование 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
Рико