1

ОС: CentOS 5.5
После добавления задания через crontab -e получаю следующую ошибку в консоли

 Консоль:
crontab: installing new crontab
"/tmp/crontab.XXXXYubcot":14: premature EOF
errors in crontab file, can't install.
Do you want to retry the same edit?

Из-за чего это может быть? Зараннее спасибо.

2

Ошибка в crontab-файле: 14 строка, преждевременный конец файла, как-то так.  wink

Был, был и весь вышел...

3

Lupo Alberto пишет:

Ошибка в crontab-файле: 14 строка, преждевременный конец файла, как-то так.  wink

Да, я уже переводил. Но тут странно то, что такое уже было на одном из серверов, что то я, то друг не могли добавить задание с такой ошибкой. Когда не мог добавить друг, то добавлял я то же самое задание, что и он писал, а когда у меня не получалось, то добавлял друг. С чем такое может быть связано? Т.е. у одного из нас была ошибка, а у другого нет и все это на одном и том же сервере с разными заданиями.

4 (18.03.2011 09:27:41 отредактировано Lupo Alberto)

4fun, покажите crontab-файл вот таким образом

cat -A /var/spool/cron/crontabs/ВАШ_ФАЙЛ

Вы пытаетесь добавить задание от обычного пользователя или root'а? Если от пользователя, входит ли он в соответствующую группу? Какой редактор используется для создания crontab-файла?

Был, был и весь вышел...

5

Lupo Alberto пишет:

Вы пытаетесь добавить задание от обычного пользователя или root'а? Если от пользователя, входит ли он в соответствующую группу?

А есть разница от рута или пользователя добавить задания? и в какую такую группу должен входить пользователь, что бы он мог выполнять задания?  oO

It is good day to die ...
MS Windows 10
Заметки о главном...

6 (18.03.2011 09:38:14 отредактировано Lupo Alberto)

i2ks пишет:

и в какую такую группу должен входить пользователь, что бы он мог выполнять задания?  blink


 Консоль:
gentoo-laptop lupo # whoami
root
gentoo-laptop lupo # ls -ld /var/spool/cron
drwxr-x--- 4 root cron 144 Авг 11  2010 /var/spool/cron/
gentoo-laptop lupo # exit
lupo@gentoo-laptop ~ % whoami
lupo
lupo@gentoo-laptop ~ % crontab -e
cannot chdir(/var/spool/cron), bailing out.
/var/spool/cron: Отказано в доступе

Был, был и весь вышел...

7 (18.03.2011 09:48:51 отредактировано i2ks)

Lupo Alberto,  Каждый пользователь системы имеет свой файл заданий crontab, в котором описано, в какое время и какие программы запускать от имени этого пользователя. Для редактирования файла crontab используется специальная одноименная программа crontab wiki.
Это у вас какой то косяк с crontab, причем судя по этой ошибке, это только на gentoo такое твориться, На freebsd, solaris, opensolaris, opensuse 9.x-11.4, FC, zenwalk как то работает  =)

4fun пишет:

После добавления задания через crontab -e получаю следующую ошибку в консоли

что хоть делаете покажите. Какое задание, как добавляли, ну и содержание скрипта сюда выкладывайте.

It is good day to die ...
MS Windows 10
Заметки о главном...

8

i2ks пишет:

Это у вас какой то косяк с crontab, причем судя по этой ошибке, это только на gentoo такое твориться,

Я не считаю недостатком возможность дополнительного контроля за пользователями.

Был, был и весь вышел...

9

Lupo Alberto пишет:

Я не считаю недостатком возможность дополнительного контроля за пользователями.

я не говорил то что это недостаток, а сказал лишь то что изначально crontab доступен пользователю, в вашей же ситуации какой то баг =)
Ладно, мы отошли от темы, ждем что скажет ТС =)

It is good day to die ...
MS Windows 10
Заметки о главном...

10

4fun пишет:

premature EOF
errors in crontab file, can't install.

отличный дистр Gentoo!!!
моя слака молча сожрала такую строчку, и тупо её НЕ выполняет.

Видимо ошибка в том, что ВСЕ строки в Linux должны заканчиваться переводом строки.
И только VIM этот перевод строки туда автоматом добавляет.

А если перевода строки нет, то это не строка, а НЕХ. Слакварь её тупо игнорит. Mandriva тоже.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

11 (18.03.2011 15:58:31 отредактировано 4fun)

Вот, собственно, задания

+ открыть спойлер

00 4 * * 1-7 root reboot
15 4 * * 1-7 root /etc/init.d/proftpd start
00 16 * * 1-7 root /etc/init.d/network restart

*/5 * * * * root /etc/init.d/cs15d48 checker
*/5 * * * * root /etc/init.d/cs19d48 checker
*/5 * * * * root /etc/init.d/cs20d48 checker
#*/5 * * * * root /etc/init.d/cs23d48 checker

10 4 * * * root /etc/init.d/css05d48
10 4 * * * root /etc/init.d/css07d48

А вот содержание скрипта

+ открыть спойлер

#!/bin/bash
# chkconfig: 2345 95 20
# description: HLDS Start Script
# Start HLDS Server
# processname: hlds
# author: LeXiKoN http://eqline.ru
# version: 0.95

# Source function library.
. /etc/rc.d/init.d/functions

VERSION=0.95

#####################################################
# Конфигурирование
#####################################################

SERVER_NAME="Server Name" #Название сервера
screen_name=source  #Название screen-сессии
path="/home/srcds/source"  #Путь до ROOT-директории сервера
hlds_ip=0.0.0.0  # внешний IP сервера
hlds_port=27010  #Порт сервера
hlds_gametype=left4dead2  #Тип игры
hlds_players=8  #Максимальное количество игроков на сервере
hlds_map=de_map  #Имя первоначальной карты при запуске
hlds_pid=source.pid
screen_pid=$screen_name-screen.pid
hlds_options="-nohltv +exec server.cfg"  #Дополнительные параметры запуска
use_user=srcds #Имя юзера от которого запускается сервер
condebug=0
check_version=0
checker_command="quakestat"

#----------------------------------------------------
# Номер ядра/процессора в линуксе
# 2х-ядерные: 0 - первое ядро, 1 - второе ядро
# 4x-ядерные: 0 - первое ядро ... 3 - четвертое ядро
# По аналогии с другими многоядерными процессорами
use_core=2
#----------------------------------------------------

#################    ВНИМАНИЕ    ###################
#
# Строчки ниже, если не знаете, лучше не трогать!
#
#################    ВНИМАНИЕ    ###################
RETVAL=0

succes="[\033[1;32m ОК \033[0m]"
failed="[\033[1;31m FAIL \033[0m]"
status_on="[\033[1;32m Online \033[0m]"
status_off="[\033[1;31m Offline \033[0m]"
title="\033[1;34m [::]\033[0m"

if [ "$condebug" -eq 1 ]; then
    hlds_options2="-condebug"
fi

# Команда screen
INTR="taskset -c $use_core /usr/bin/screen -A -m -d -S $screen_name"

if [ ! -x $path/srcds_run ]; then
    printf "\033[22;31m Проверьте права на исполнение srcds_run \033[0m\n"
    exit 1
fi

prestart_check() {
    if [ -f $path/$hlds_gametype/$hlds_pid ] && [ -f $path/$screen_pid ]; then
        ch=`ps -ef | grep SCREEN | grep $screen_name`
        if [ -n "$ch" ]; then
            echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            printf "\033[1;34m Сервер $SERVER_NAME\033[0m \033[32m(!!) на данный момент УЖЕ работает (!!)\033[0m\n"
            echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            exit 1
        else
            cd $path
            rm -rf $path/$screen_pid
            rm -rf $path/$hlds_gametype/$hlds_pid
        fi
    fi
}

start() {
    if [ "$check_version" -eq 1 ]; then
        check_version
    fi
    # Проверка престартовая
    prestart_check
    echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    cd $path
    $INTR sudo -u $use_user ./srcds_run -game $hlds_gametype +maxplayers $hlds_players +map $hlds_map +hostip $hlds_ip +hostport $hlds_port $hlds_options $hlds_options2 -pidfile $hlds_pid
    # Поиск и запись пидов процессов сервера и скринв системе
    ps -ef | grep SCREEN | grep "$screen_name" | grep -v grep | awk '{ print $2}' > $path/$screen_pid
    printf "$title\033[1;34m Запуск сервера $SERVER_NAME \033[0m\n"
    printf "\033[1;35m Порт севрера:\033[0m \033[1;36m$hlds_port\033[0m\n"
    printf "\033[1;35m Привязка к ядру:\033[0m \033[1;36m$use_core\033[0m\n"
    printf "\033[1;35m Запуск от юзера:\033[0m \033[1;36m$use_user\033[0m\n"
    printf "\033[1;33m Статус ~> \033[0m"
    sleep 1
    if [ -f $path/$hlds_gametype/$hlds_pid ] && [ -f $path/$screen_pid ]; then
        ch=`ps -ef | grep SCREEN | grep $screen_name`
        if [ -n "$ch" ]; then
            printf "%53s$succes \n"
        else
            printf "%53s$failed \n"
        fi
    fi
    echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
}

stop() {
    if [ "$check_version" -eq 1 ]; then
        check_version
    fi
    echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    if [ -f $path/$hlds_pid ] && [ -f $path/$screen_pid ]; then
        # Извлекаем ID процесса из файла и увибаем процессы
        /usr/bin/screen -R $screen_name -X quit
        sleep 1
        rm -rf $path/$screen_pid
        rm -rf $path/$hlds_pid

        printf "$title\033[1;31m Остановка $SERVER_NAME \033[0m"
        printf "%33s$succes \n"

    else
        printf "\033[1;34m Невозможно остановить $SERVER_NAME, сервер НЕ запущен \033[0m"
        printf "%5s$failed \n"
    fi
    echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
}

status() {
    if [ "$check_version" -eq 1 ]; then
        check_version
    fi
    echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    printf "$title\033[1;34m Статус сервера $SERVER_NAME \033[0m\n"
    printf "\033[1;35m Порт севрера:\033[0m \033[1;36m$hlds_port\033[0m\n"
    printf "\033[1;35m Привязка к ядру:\033[0m \033[1;36m$use_core\033[0m\n"
    printf "\033[1;35m Запуск от юзера:\033[0m \033[1;36m$use_user\033[0m\n"
    printf "\033[1;33m Статус ~> \033[0m"
    sleep 1
    ch=`ps -ef | grep SCREEN | grep $screen_name`
    if [ -n "$ch" ]; then
        printf "%49s$status_on \n"
    else
        printf "%48s$status_off \n"
    fi
    echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
}

console() {
    if [ "$check_version" -eq 1 ]; then
        check_version
    fi
    echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    if [ -f $path/$hlds_gametype/$hlds_pid ] && [ -f $path/$screen_pid ]; then
        printf "$title\033[1;34m Подключение к консоли $SERVER_NAME сервера \033[0m\n"
        echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        printf "\033[36m Для выхода из консоли поочерёдно нажать \033[1;36mCtrl+A, D \033[0m\n"
        printf "\033[36m Для листинга консоли поочерёдно нажать \033[1;36mCtrl+A, Esc \033[0m\n"
        printf "\033[36m Для выхода из режима листинга нажать \033[1;36mEsc \033[0m\n"
        printf "\033[1;31m Внимание!!! По неаккуратности можно положить сервер ag \033[0m\n"
        echo " Консоль включится через 5 секунд..."
        sleep 5
        /usr/bin/screen -R $screen_name
    else
        printf "\033[1;31m Невозможно подключиться к $SERVER_NAME, сервер не запущен \033[0m\n"
    fi
}

compile() {
    if [ "$check_version" -eq 1 ]; then
        check_version
    fi
    echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    if [ -d $path/cstrike/addons/amxmodx ]; then
        printf "\033[32m Компиляция плагинов AmxModX \033[0m\n"
        echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        printf "\033[36m Компилируются исходные файлы (sma), находящиеся в директории {addons/amxmodx/scripting/*.sma} \033[0m\n"
        printf "\033[36m По завершению компиляции нажмите Q для выхода \033[0m\n"
        printf "\033[36m Компиляция начнется через 2 секунды. \033[0m\n"
        sleep 2
        cd $path/cstrike/addons/amxmodx/scripting
        ./compile.sh
        echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        printf "\033[32m Плагины скомпилированы \033[0m\n"
    else
        printf "\033[22;31m Проверьте установлен ли AmxModX (??) \033[0m\n"
    fi
    echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
}

check_version() {
    echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    cd $path
    rm -f version.txt
    wget http://eqline.ru/project/hlds_init_script/version.txt 1> /dev/null 2>&1
    sleep 1
    for ver in `cat $path/version.txt`
    do
        if [ $VERSION \< $ver ]; then
            printf "\033[1;31m Доступна новая версия скрипта ( $ver )\033[0m\n"
            printf "\033[36m Подробнее на форуме eQline.ru: http://forum.eqline.ru \033[0m\n"
            printf "\033[1;36m Ссылка: http://forum.eqline.ru/topic/361-скрипт … -серверов/ \033[0m\n"
        else
            printf "\033[1;36m Ваша версия является последней\033[0m \033[1;34m( Текущая версия: $VERSION ) \033[0m\n"
        fi
    break
    done
    echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    rm -f version.txt
    sleep 1
}

check_logsize() {
    printf "\033[1;35m Проверка размера .log файлов \033[0m\n"
    maxlogsize=10485760
    if [ -f $path/checker.log ]; then
        sizeCheckUP=`stat -c%s $path/checker.log`
        printf "\033[1;36m Размер checker.log:\033[0m \033[1;34m $sizeCheckUP байт\033[0m\n"
        if [ "$sizeCheckUP" -ge "$maxlogsize" ]; then
            printf "\033[1;31m Очищаю файл checker.log\033[0m\n"
            tail -n 50 $path/checker.log > $path/checker.temp
            mv $path/checker.temp $path/checker.log 
            sleep 1
        fi
    else
        printf "\033[1;31m Файл checker.log отсутствует\033[0m\n"
    fi
    if [ -f $path/cstrike/qconsole.log ]; then
        sizeQconsole=`stat -c%s $path/cstrike/qconsole.log`
        printf "\033[1;36m Размер qconsole.log:\033[0m \033[1;34m $sizeQconsole байт\033[0m\n"
        if [ "$sizeQconsole" -ge "$maxlogsize" ]; then
            printf "\033[1;31m Очищаю файл qconsole.log\033[0m\n"
            tail -n 50 $path/cstrike/qconsole.log >  $path/cstrike/qconsole.temp
            mv  $path/cstrike/qconsole.temp  $path/cstrike/qconsole.log
            sleep 1
        fi
    else
        printf "\033[1;31m Файл qconsole.log отсутствует\033[0m\n"
    fi
}

checker() {
    checktag="[HLDS-CheckUP]"
    checkresponse=`$checker_command -P -a2s $hlds_ip:$hlds_port | grep response`
    if [ -n "$checkresponse" ]; then
        printf "\033[1;37m$checktag\033[0m $SERVER_NAME \033[31m*[No response]*\033[0m\n"
        # echo Отсылаем почту
        cd $path
        time=`date +%X`
        date=`date +%D`
        inlog=`$checker_command -P -a2s $hlds_ip:$hlds_port | grep response`
        printf "[$time - $date] *[No response]* $inlog\n" >> checker.log
        stop
        sleep 2
        start
        sleep 1
        echo ----------------ATTANTION---------------- >> checker.log
        printf "StartUP $SERVER_NAME:" >> checker.log
        ch=`ps -ef | grep SCREEN | grep $screen_name`
        if [ -n "$ch" ]; then
            printf " *[OK]* \n" >> checker.log
        else
            printf " *[FAILED]* \n" >> checker.log
        fi
        echo ----------------------------------------- >> checker.log
        exit 1
    fi
    checkdown=`$checker_command -P -a2s $hlds_ip:$hlds_port | grep DOWN`
    if [ -n "$checkdown" ]; then
        printf "\033[1;37m$checktag\033[0m $SERVER_NAME \033[31m*[DOWN]*\033[0m\n"
        # echo Отсылаем почту
        cd $path
        time=`date +%X`
        date=`date +%D`
        inlog=`$checker_command -P -a2s $hlds_ip:$hlds_port | grep DOWN`
        printf "[$time - $date] *[DOWN]* $inlog\n" >> checker.log
        stop
        sleep 2
        start
        sleep 1
        echo ----------------ATTANTION---------------- >> checker.log
        printf "StartUP $SERVER_NAME:" >> checker.log
        ch=`ps -ef | grep SCREEN | grep $screen_name`
        if [ -n "$ch" ]; then
            printf " *[OK]* \n" >> checker.log
        else
            printf " *[FAILED]* \n" >> checker.log
        fi
        echo ----------------------------------------- >> checker.log
        exit 1
    fi
    checkup=`$checker_command -P -a2s $hlds_ip:$hlds_port | grep cstrike`
    if [ -n "$checkup" ]; then
        printf "\033[1;37m$checktag\033[0m $SERVER_NAME \033[32m*[OK]*\033[0m\n"
        cd $path
        time=`date +%X`
        date=`date +%D`
        inlog=`quakestat -P -a2s $hlds_ip:$hlds_port | grep cstrike`
        printf "[$time - $date] *[OK]* $inlog\n" >> checker.log
        exit 1
    fi
}

case "$1" in
    start)
        check_logsize
        start
    ;;
    stop)
        stop
    ;;
    restart)
        stop
        sleep 2
        start
    ;;
    status)
        status
    ;;
    console)
        console
    ;;
    compile)
        compile
    ;;
    update)
        check_version
    ;;
    checker)
        checker
    ;;
    logsize)
        check_logsize
    ;;
    *)
    echo "Usage: $0 {start|stop|restart|status|console|compile|update|checker|logsize}"
    exit 1
esac
exit 0

Но со скриптом, думаю, все нормально, т.к. на одном сервере все прекрасно работает.
Пользуюсь редактором mcedit
Задания добавлял под root'ом

И еще один вопрос. Почему один из скриптов через крон запускается, а второй нет, хотя вручную он запускается.
Прописано, вроде, правильно

+ открыть спойлер

10 4 * * * root /etc/init.d/css05d48
10 4 * * * root /etc/init.d/css07d48

12

4fun пишет:

Пользуюсь редактором mcedit

вот как раз mcedit и НЕ работает. добавьте пустую строку!

4fun пишет:

Но со скриптом, думаю, все нормально, т.к. на одном сервере все прекрасно работает.

почту почитайте

 Консоль:
# mutt

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

13

drBatty пишет:
4fun пишет:

Пользуюсь редактором mcedit

вот как раз mcedit и НЕ работает. добавьте пустую строку!
почту почитайте

Не совсем понял, о какой пустой строке речь? И ведь у друга работает с mcedit.
Почту прочел, как я понял, записаны выполнения задач крона.

14

4fun пишет:

Не совсем понял, о какой пустой строке речь?

Файл должен заканчиваться пустой строкой. После ввода последней строки нажмите «Enter» и сохранитесь.

Был, был и весь вышел...

15

4fun пишет:

Почту прочел, как я понял, записаны выполнения задач крона.

угу.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

16

Спасибо всем за помощь. Дело было все-таки в том, что не оставлял чистую строку. Сейчас все норм.

17

4fun пишет:

Спасибо всем за помощь. Дело было все-таки в том, что не оставлял чистую строку. Сейчас все норм.

дело не в пустой строке.
вот файл:

 Консоль:
$ cat f.txt
"%06.6_ao "  1/1 "%01x "
"\n"

тут 2 строки
вот бинарный код:
 Консоль:
$ xxd -c1 f.txt
0000000: 22  "
0000001: 25  %
0000002: 30  0
0000003: 36  6
0000004: 2e  .
0000005: 36  6
0000006: 5f  _
0000007: 61  a
0000008: 6f  o
0000009: 20   
000000a: 22  "
000000b: 20   
000000c: 20   
000000d: 31  1
000000e: 2f  /
000000f: 31  1
0000010: 20   
0000011: 22  "
0000012: 25  %
0000013: 30  0
0000014: 31  1
0000015: 78  x
0000016: 20   
0000017: 22  "
0000018: 0a  .
0000019: 22  "
000001a: 5c  \
000001b: 6e  n
000001c: 22  "
000001d: 20   
000001e: 0a  .

видите, в конце обоих строк стоит 0a, это перевод строки. Если он не стоит в конце файла, то последняя строка == НЕСТРОКА. А НЕХ. Какие-то то левые байты в конце файла. Хвала гентушной crontab, что она хоть предупреждает об этом, ВСЕ другие программы, в частности crontab'ы из других дистрибутивов, попросту игнорируют этот хвост. Такие дела...

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)