Задать вопрос

Почему крон выполняет три запроса вместо одного?

Доброго времени суток. Подскажите пожалуйста, почему крон дублирует запись в БД 3 раза подряд?
Суть крона: Каждый час, он отслеживает нагрузку и отправляет результат в БД. Каждые два часа, должен отрисовываться график. Но cron выполняет задание 3 раза и 3 раза вносит результаты в график. Соответственно, на графике выводится три одинаковых даты.
Вот команда крона (Выполнение каждый час):
0 */1 * * * screen -dmS graph_servers_hour bash -c 'cd /var/gsmanager && php cron.php kJ3odY threads graph_servers_hour'


Вот код на php, который отслеживает крон и отправляет результаты в БД. А так-же, каждые два часа отправляет данные на график:
<?php
	if(!DEFINED('GSmanager'))
		exit(header('Refresh: 0; URL=http://'.$_SERVER['SERVER_NAME'].'/404'));

	class graph_servers_hour extends cron
	{
		function __construct()
		{
			global $sql, $start_point;

			$servers = $sql->query('SELECT `id`, `online`, `ram_use`, `cpu_use`, `hdd_use`, `date` FROM `servers` ORDER BY `id` ASC');

			while($server = $sql->get($servers))
			{
				if($server['date']+3600 > $start_point)
					continue;

				$sql->query('INSERT INTO `graph_hour` set `server`="'.$server['id'].'",'
						.'`online`="'.$server['online'].'",'
						.'`cpu`="'.$server['cpu_use'].'",'
						.'`ram`="'.$server['ram_use'].'",'
						.'`hdd`="'.$server['hdd_use'].'", `time`="'.$start_point.'"');
			}

			return NULL;
		}
	}
?>
  • Вопрос задан
  • 484 просмотра
Подписаться 2 Средний Комментировать
Решения вопроса 2
saboteur_kiev
@saboteur_kiev Куратор тега Linux
software engineer
0 */1 * * * screen -dmS graph_servers_hour bash -c 'cd /var/gsmanager && php cron.php kJ3odY threads graph_servers_hour'

Зачем */1 и screen если достаточно просто *

0 * * * * cd /var/gsmanager && php cron.php kJ3odY threads graph_servers_hour


Ну и судя по вашему прошлому вопросу, вы у себя видимо задачи уже путаете. Проверьте другие задачи. И упростите записи.
Ответ написан
Комментировать
dimonchik2013
@dimonchik2013
non progredi est regredi
декомпозируй:

0) */1 где тут каждые два часа?

1) как из cmd ведет?
2) как в файл ведет?
3) как только с одним параметром ведет?
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
ky0
@ky0 Куратор тега Системное администрирование
Миллиардер, филантроп, патологический лгун
Зачем вы всё это в скрине запускаете? Зачем какой-то промежуточный "скрипт, отслеживающий крон"? Я вижу в этой архитектуре возможности для упрощения.

*/1 - избыточная композиция, достаточно написать 0 * * * *.
Ответ написан
Комментировать
zabudkin
@zabudkin
Инженер-системотехник, программист, админ, ТПУ!!!!
0 */1

если каждые два часа, то вернее так:
0 */2

далее:

if($server['date']+3600 > $start_point)
continue;

- скорее всего рассинхрон также идёт по времени запуска скрипта кроном и в самом скрипте, попробуйте +3601
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы