LinuxForum.Fans
Тема

Проблема с кроном

Автор: 4fun 17 сообщений 6367 просмотров
#141385

ОС: CentOS 5.5
После добавления задания через crontab -e получаю следующую ошибку в консоли
[console]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?[/console]
Из-за чего это может быть? Зараннее спасибо.

#141386

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

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

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

#141420

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

text

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

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

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

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

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

[console]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: Отказано в доступе[/console]

#141434

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

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

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

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

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

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

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

#141459
4fun написал:
premature EOF
errors in crontab file, can't install.

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

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

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

#141575

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

Показать
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 Внимание!!! По неаккуратности можно положить сервер :D \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-скрипт-запуска-hlds-серверов/ \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
#141583
4fun написал:
Пользуюсь редактором mcedit

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

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

почту почитайте
[console]# mutt[/console]

#141588
drBatty написал:
[quote=4fun]Пользуюсь редактором mcedit

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

#141589
4fun написал:
Не совсем понял, о какой пустой строке речь?

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

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

угу.

#141688

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

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

дело не в пустой строке.
вот файл:
[console]$ cat f.txt
"%06.6_ao " 1/1 "%01x "
"\n"
[/console]
тут 2 строки
вот бинарный код:
[console]$ 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 .
[/console]
видите, в конце обоих строк стоит 0a, это перевод строки. Если он не стоит в конце файла, то последняя строка == НЕСТРОКА. А НЕХ. Какие-то то левые байты в конце файла. Хвала гентушной crontab, что она хоть предупреждает об этом, ВСЕ другие программы, в частности crontab'ы из других дистрибутивов, попросту игнорируют этот хвост. Такие дела...

Войдите или зарегистрируйтесь, чтобы ответить.