ugrás a tartalomhoz

cron job

skull87 · 2013. Okt. 1. (K), 17.35
Sziasztok,

segitséget szeretnék mert el akadtam, egy hostingon van egy crm portálom és fetch mailt használok amihez szükséges l efuttatni a cron.php scriptet.

Eddig saját szerveren volt a portál és ott crontab -ban simán tudtam ütemezni a feladatot de itt a hostingon web cron van csak amibe ha beirom az elérési utat csak pörög az oldal de semmi nem történik.

Az eddigi parancsom igy nézett ki:

5 * * * * php /webservice/cron.php –auth_user=username –auth_pwd=password! –status_only=1

ezt hogyan tudnám megoldani online?

Elöre is köszönöm!
 
1

Mit is?

janoszen · 2013. Okt. 1. (K), 23.52
Nem egeszen ertem, tehat egy szolgaltatotol berelsz webtarhelyet es ott nem mukodik valami? Vagy van egy sajat szervered amire feltelepitettel valami random admin panelt es azzal nem boldogulsz?
3

Eddig saját szerveren ment az

skull87 · 2013. Okt. 2. (Sze), 07.55
Eddig saját szerveren ment az apache, mysql, php stb ott a cron ütemezés is jól müködött, de át áltam ininetes hostingra ahol van webcron de ott nem jó nekem a script futtatása mert nem elég a scriptet megnyitni böngészöből mert az még kevés hozzá.

A saját szerveren a fent leirt paraméterrel futtattam a saját szerveren.

A saját szerveren nem kellett admin panel mert linux srv volt és a crontab megoldotta.
5

Support?

janoszen · 2013. Okt. 2. (Sze), 08.01
És akkor miért nem kérdezed meg a szolgáltató supportját?
7

Ledobta magárol a dolgot

skull87 · 2013. Okt. 2. (Sze), 08.39
Ledobta magárol a dolgot azzal, hogy biztosan meglehet oldani másképp is :)
14

Valts szolgaltatot

janoszen · 2013. Okt. 2. (Sze), 12.53
Ne haragudj, ha a szolgaltatod az altala kinalt feluletre azt mondja, hogy nem tudja, hogy mukodik, akkor valts szolgaltatot, mert ez tukrozi a teljes hozzaallasat es hozzaerteset a dologhoz. Legkozelebb a biztonsagi mentesre vagy a meghibasodott diskre mondja ezt?

Amiert mi nem tudunk valaszolni: nem tudjuk, melyik szolgaltatorol es szoftverrol van szo.
15

Írta feljebb, hogy az

Hidvégi Gábor · 2013. Okt. 2. (Sze), 13.19
Írta feljebb, hogy az ininetnél van. Történetesen nekem is van mától ininet hozzáférésem, megnéztem, és a postban leírt formában lehet megadni náluk is a cron feladatokat. Innentől kezdve skull87-en múlik minden.
2

biztos kell?

numen · 2013. Okt. 1. (K), 23.55
1. Biztosan le kell futnia ötpercenként? Amikor hasonló nyűgöm volt, simán futtattam a cront minden oldalbetöltéskor, és megnéztem, hogy letelt-e az idő amíg újra futtatni kéne (esetleg azt is, hogy hányszor telt el)

2. A webcron biztos kezeli a command line paramétereket? Nem ismerem a rendszert. Írass debug fájlt a scripttel, az talán segít kideríteni, hogy meddig fut le… Egyáltalán, ír valami érdekeset a web cron dokumentációja?
4

Öt percenként kell futni mert

skull87 · 2013. Okt. 2. (Sze), 07.58
Öt percenként kell futni mert a megadott postafiokról imappal behuzza a leveleket a portálra kérésként ez müködik is saját szerveren de a külsö hostingon csak webcront tudok futtatni (ininet).
Valami olyan megoldás kellene amivel tudnám emulálni neki a fent kiadott parancsot vagy valami hasonló dolog.

Sajnos a dokumentáció szinte 0 ehez a részéhez a crm -k csak annyit ir, hogy web cronnal is futtatható de csak ugy simán nem nyeli le a script.
6

Ha a paramétereket nem

Hidvégi Gábor · 2013. Okt. 2. (Sze), 08.24
Ha a paramétereket nem parancssorból várná a cron.php, hanem beégetnéd, akkor szerintem megoldanád a problémát.
8

Nem muszáj beégetni, ha olyan

inf · 2013. Okt. 2. (Sze), 08.41
Nem muszáj beégetni, ha olyan cron modulról van szó, ami gettel kéri le a megadott oldalt, akkor be lehet lőni queryString-ben is. Egyelőre semmit nem tudunk arról, hogy mik a lehetőségei, meg milyen típusú cron-ról van szó...
9

probáltam, hogy a cron.php

skull87 · 2013. Okt. 2. (Sze), 08.42
probáltam, hogy a cron.php -ben ahol láttam a sorban a sablon parancsot, hogy mit kell bekérni kitöltöttem a valós adatokkal de továbbra is csak homokorázik az oldal ha a cron.php -ra mejek...

"function UsageAndExit($oP)
{
$bModeCLI = utils::IsModeCLI();

if ($bModeCLI)
{
$oP->p("USAGE:\n");
$oP->p("php cron.php --auth_user=felhasználo --auth_pwd=jelszó\n");
}
else
{
$oP->p("Optional parameters: verbose, param_file, status_only\n");
}
$oP->output();
exit -2;
}
"
10

Nem igazán értem a problémát.

inf · 2013. Okt. 2. (Sze), 08.47
Nem igazán értem a problémát. Eddig CLI-ből hívtad a cron.php-t, most meg böngészőből vagy GET-es cronnal és most nem működik?

Valami alapvető debugot próbáltál már? Mondjuk kicommentezni részeket a kódban, aztán megnézni, hogy minél akad el?
11

igen most böngészőből akarom,

skull87 · 2013. Okt. 2. (Sze), 08.53
igen most böngészőből akarom, bemásolom a scriptet az a legtisztább mindenkinek :)

<?php
// Copyright (C) 2010-2013 Combodo SARL
//
//   This file is part of iTop.
//
//   iTop is free software; you can redistribute it and/or modify	
//   it under the terms of the GNU Affero General Public License as published by
//   the Free Software Foundation, either version 3 of the License, or
//   (at your option) any later version.
//
//   iTop is distributed in the hope that it will be useful,
//   but WITHOUT ANY WARRANTY; without even the implied warranty of
//   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//   GNU Affero General Public License for more details.
//
//   You should have received a copy of the GNU Affero General Public License
//   along with iTop. If not, see <http://www.gnu.org/licenses/>

/**
 * Heart beat of the application (process asynchron tasks such as broadcasting email)
 *
 * @copyright   Copyright (C) 2010-2012 Combodo SARL
 * @license     http://opensource.org/licenses/AGPL-3.0
 */

if (!defined('__DIR__')) define('__DIR__', dirname(__FILE__));
require_once(__DIR__.'/../approot.inc.php');
require_once(APPROOT.'/application/application.inc.php');
require_once(APPROOT.'/application/nicewebpage.class.inc.php');
require_once(APPROOT.'/application/webpage.class.inc.php');
require_once(APPROOT.'/application/clipage.class.inc.php');
require_once(APPROOT.'/application/startup.inc.php');



function ReadMandatoryParam($oP, $sParam, $sSanitizationFilter = 'parameter')
{
	$sValue = utils::ReadParam($sParam, null, true /* Allow CLI */, $sSanitizationFilter);
	if (is_null($sValue))
	{
		$oP->p("ERROR: Missing argument '$sParam'\n");
		UsageAndExit($oP);
	}
	return trim($sValue);
}

function UsageAndExit($oP)
{
	$bModeCLI = utils::IsModeCLI();

	if ($bModeCLI)
	{
		$oP->p("USAGE:\n");
		$oP->p("php cron.php --auth_user=username --auth_pwd=password\n");		
	}
	else
	{
		$oP->p("Optional parameters: verbose, param_file, status_only\n");		
	}
	$oP->output();
	exit -2;
}

function RunTask($oBackgroundProcess, BackgroundTask $oTask, $oStartDate, $iTimeLimit)
{
	try
	{
		$oNow = new DateTime();
		$fStart = microtime(true);
		$sMessage = $oBackgroundProcess->Process($iTimeLimit);
		$fDuration = microtime(true) - $fStart;
		$oTask->ComputeDurations($fDuration);
		$oTask->Set('latest_run_date', $oNow->format('Y-m-d H:i:s'));
		$oPlannedStart = new DateTime($oTask->Get('latest_run_date'));
		// Let's assume that the task was started exactly when planned so that the schedule does no shift each time
		// this allows to schedule a task everyday "around" 11:30PM for example
		$oPlannedStart->modify('+'.$oBackgroundProcess->GetPeriodicity().' seconds');
		$oEnd = new DateTime();
		if ($oPlannedStart->format('U') < $oEnd->format('U'))
		{
			// Huh, next planned start is already in the past, shift it of the periodicity !
			$oPlannedStart = $oEnd->modify('+'.$oBackgroundProcess->GetPeriodicity().' seconds');
		}
		$oTask->Set('next_run_date', $oPlannedStart->format('Y-m-d H:i:s'));
		$oTask->DBUpdate();
	}
	catch(Exception $e)
	{
		$sMessage = 'Processing failed, the following exception occured: '.$e->getMessage();
	}
	return $sMessage;	
}

// Known limitation - the background process periodicity is NOT taken into account
function CronExec($oP, $aBackgroundProcesses, $bVerbose)
{
	$iStarted = time();
	$iMaxDuration = MetaModel::GetConfig()->Get('cron_max_execution_time');
	$iTimeLimit = $iStarted + $iMaxDuration;
	
	if ($bVerbose)
	{
		$oP->p("Planned duration = $iMaxDuration seconds");
	}

	$iCronSleep = MetaModel::GetConfig()->Get('cron_sleep');
	
	$oSearch = new DBObjectSearch('BackgroundTask');
	while (time() < $iTimeLimit)
	{
		$oTasks = new DBObjectSet($oSearch);
		$aTasks = array();
		while($oTask = $oTasks->Fetch())
		{
			$aTasks[$oTask->Get('class_name')] = $oTask;
		}
		foreach ($aBackgroundProcesses as $oBackgroundProcess)
		{
			$sTaskClass = get_class($oBackgroundProcess);
			$oNow = new DateTime();
			if (!array_key_exists($sTaskClass, $aTasks))
			{
				// New entry, let's create a new BackgroundTask record and run the task immediately
				$oTask = new BackgroundTask();
				$oTask->Set('class_name', get_class($oBackgroundProcess));
				$oTask->Set('first_run_date', $oNow->format('Y-m-d H:i:s'));
				$oTask->Set('total_exec_count', 0);
				$oTask->Set('min_run_duration', 99999.999);
				$oTask->Set('max_run_duration', 0);
				$oTask->Set('average_run_duration', 0);
				$oTask->Set('next_run_date', $oNow->format('Y-m-d H:i:s')); // in case of crash...
				$oTask->DBInsert();
				if ($bVerbose)
				{
					$oP->p(">> === ".$oNow->format('Y-m-d H:i:s').sprintf(" Starting:%-'=40s", ' '.$sTaskClass.' (first run) '));
				}
				$sMessage = RunTask($oBackgroundProcess, $oTask, $oNow, $iTimeLimit);
				if ($bVerbose)
				{
					if(!empty($sMessage))
					{
						$oP->p("$sTaskClass: $sMessage");
					}
					$oEnd = new DateTime();
					$oP->p("<< === ".$oEnd->format('Y-m-d H:i:s').sprintf(" End of:  %-'=40s", ' '.$sTaskClass.' '));
				}
			}
			else if( ($aTasks[$sTaskClass]->Get('status') == 'active') && ($aTasks[$sTaskClass]->Get('next_run_date') <= $oNow->format('Y-m-d H:i:s')))
			{
				$oTask = $aTasks[$sTaskClass];
				// Run the task and record its next run time
				if ($bVerbose)
				{
					$oP->p(">> === ".$oNow->format('Y-m-d H:i:s').sprintf(" Starting:%-'=40s", ' '.$sTaskClass.' '));
				}
				$sMessage = RunTask($oBackgroundProcess, $aTasks[$sTaskClass], $oNow, $iTimeLimit);
				if ($bVerbose)
				{
					if(!empty($sMessage))
					{
						$oP->p("$sTaskClass: $sMessage");
					}
					$oEnd = new DateTime();
					$oP->p("<< === ".$oEnd->format('Y-m-d H:i:s').sprintf(" End of:  %-'=40s", ' '.$sTaskClass.' '));
				}
			}
			else 
			{
				// will run later
				if (($aTasks[$sTaskClass]->Get('status') == 'active') && $bVerbose)
				{
					$oP->p("Skipping asynchronous task: $sTaskClass until ".$aTasks[$sTaskClass]->Get('next_run_date'));
				}
			}
		}
		if ($bVerbose)
		{
			$oP->p("Sleeping");
		}
		sleep($iCronSleep);
	}
	if ($bVerbose)
	{
		$oP->p("Reached normal execution time limit (exceeded by ".(time()-$iTimeLimit)."s)");
	}
}

function DisplayStatus($oP)
{
	$oSearch = new DBObjectSearch('BackgroundTask');
	$oTasks = new DBObjectSet($oSearch);
	$oP->p('+---------------------------+---------+---------------------+---------------------+--------+-----------+');
	$oP->p('| Task Class                | Status  | Last Run            | Next Run            | Nb Run | Avg. Dur. |');
	$oP->p('+---------------------------+---------+---------------------+---------------------+--------+-----------+');
	while($oTask = $oTasks->Fetch())
	{
		$sTaskName = $oTask->Get('class_name');
		$sStatus = $oTask->Get('status');
		$sLastRunDate = $oTask->Get('latest_run_date');
		$sNextRunDate = $oTask->Get('next_run_date');
		$iNbRun = (int)$oTask->Get('total_exec_count');
		$sAverageRunTime = $oTask->Get('average_run_duration');
		$oP->p(sprintf('| %1$-25.25s | %2$-7s | %3$-19s | %4$-19s | %5$6d | %6$7s s |', $sTaskName, $sStatus, $sLastRunDate, $sNextRunDate, $iNbRun, $sAverageRunTime));
	}	
	$oP->p('+---------------------------+---------+---------------------+---------------------+--------+-----------+');
}
////////////////////////////////////////////////////////////////////////////////
//
// Main
//
if (utils::IsModeCLI())
{
	$oP = new CLIPage("iTop - CRON");
}
else
{
	$oP = new WebPage("iTop - CRON");
}

try
{
	utils::UseParamFile();
}
catch(Exception $e)
{
	$oP->p("Error: ".$e->GetMessage());
	$oP->output();
	exit -2;
}

if (utils::IsModeCLI())
{
	// Next steps:
	//   specific arguments: 'csvfile'
	//   
	$sAuthUser = ReadMandatoryParam($oP, 'auth_user', 'raw_data');
	$sAuthPwd = ReadMandatoryParam($oP, 'auth_pwd', 'raw_data');
	if (UserRights::CheckCredentials($sAuthUser, $sAuthPwd))
	{
		UserRights::Login($sAuthUser); // Login & set the user's language
	}
	else
	{
		$oP->p("Access wrong credentials ('$sAuthUser')");
		$oP->output();
		exit -1;
	}
}
else
{
	$_SESSION['login_mode'] = 'basic';
	require_once(APPROOT.'/application/loginwebpage.class.inc.php');
	LoginWebPage::DoLogin(); // Check user rights and prompt if needed
}

if (!UserRights::IsAdministrator())
{
	$oP->p("Access restricted to administrators");
	$oP->Output();
	exit -1;
}


// Enumerate classes implementing BackgroundProcess
//
$aBackgroundProcesses = array();
foreach(get_declared_classes() as $sPHPClass)
{
	$oRefClass = new ReflectionClass($sPHPClass);
	$oExtensionInstance = null;
	if ($oRefClass->implementsInterface('iBackgroundProcess'))
	{
		if (is_null($oExtensionInstance))
		{
			$oExecInstance = new $sPHPClass;
		}
		$aBackgroundProcesses[$sPHPClass] = $oExecInstance;
	}
}


$bVerbose = utils::ReadParam('verbose', false, true /* Allow CLI */);

if ($bVerbose)
{
	$aDisplayProcesses = array();
	foreach ($aBackgroundProcesses as $oExecInstance)
	{
		$aDisplayProcesses[] = get_class($oExecInstance);
	}
	$sDisplayProcesses = implode(', ', $aDisplayProcesses);
	$oP->p("Background processes: ".$sDisplayProcesses);
}
if (utils::ReadParam('status_only', false, true /* Allow CLI */))
{
	// Display status and exit
	DisplayStatus($oP);
	exit(0);
}

// Compute the name of a lock for mysql
// The name is server-wide
$oConfig = utils::GetConfig();
$sLockName = 'itop.cron.'.$oConfig->GetDBName().'_'.$oConfig->GetDBSubname();

$oP->p("Starting: ".time().' ('.date('Y-m-d H:i:s').')');

// CAUTION: using GET_LOCK anytime on the same connexion will RELEASE the lock
// Todo: invoke GET_LOCK from a dedicated session (encapsulate that into a mutex class)
$res = CMDBSource::QueryToScalar("SELECT GET_LOCK('$sLockName', 1)");// timeout = 1 second (see also IS_FREE_LOCK)
if (is_null($res))
{
	// TODO - Log ?
	$oP->p("ERROR: Failed to acquire the lock '$sLockName'");
}
elseif ($res === '1')
{
	// The current session holds the lock
	try
	{
		CronExec($oP, $aBackgroundProcesses, $bVerbose);
	}
	catch(Exception $e)
	{
		// TODO - Log ?
	   $oP->p("ERROR:".$e->getMessage());
	   $oP->p($e->getTraceAsString());
	}
	$res = CMDBSource::QueryToScalar("SELECT RELEASE_LOCK('$sLockName')");
}
else
{
	// Lock already held by another session
	// Exit silently
	$oP->p("Already running...");
}
$oP->p("Exiting: ".time().' ('.date('Y-m-d H:i:s').')');

$oP->Output();
?>
12

A main részekbe tegyél szépen

inf · 2013. Okt. 2. (Sze), 09.04
A main részekbe tegyél szépen sorban exit-eket minden nagyobb blokk után, aztán egyesével szedegesd ki. Amíg meg nem találod azt a blokkot, ami miatt a homokórázás van. Ráézésre nem nagyon lehet megmondani. A timelimit be van állítva rendesen? Már úgy értem látok benne olyan változót. Ha túl nagy a timelimit, akkor gondolom szépen sorban csinálja a task-jeit, amíg le nem jár, azért homokórázik... A böngészőben nem kapod meg úgy a konzol-ba tett szöveget, mint cli-ben, ott meg kell várni, amíg lefut a teljes script, és egyszerre fogja elküldeni a végén... Jobban járnál, ha a

if (utils::IsModeCLI())  
{  
    $oP = new CLIPage("iTop - CRON");  
}  
else  
{  
    $oP = new WebPage("iTop - CRON");  
} 
WebPage helyett írnál egy saját megoldást, ami fájlba loggol, vagy betennél egy flush-t a WebPage-be minden bejegyzés után, hogy el is jusson a böngészőbe... Ez utóbbi nem tudom, hogy mennyire életszerű, még sosem használtam.
13

Köszönöm szépen a segitséget,

skull87 · 2013. Okt. 2. (Sze), 09.50
Köszönöm szépen a segitséget, már lefut a script csak problémázik a gmail imappal de az már csak finomhangolás kérdése.

A leggyorsabb megoldás a timelimit volt ami 600 sec -re volt alapból állitva ezt át állitottam 60 sec -re és igy vissza is adja a bongésző a status ablakot, hogy mi történt :)
16

Ja, gondoltam, hogy nem a

inf · 2013. Okt. 2. (Sze), 18.22
Ja, gondoltam, hogy nem a kódban van a hiba, hanem a beállításokban. A flush-ot kipróbálnám a helyedben, hátha úgy töltögetés közben is jönne vissza adat az oldalról, amit kiír, és nem kéne végigvárni... Bár én ezt csak elméletben tudom, gyakorlatban sosem próbáltam. :D Azt hiszem kipróbálom egy sleep-es oldallal, hogy tényleg műdködik e...
17

Kiprobálom majd azt is csak

skull87 · 2013. Okt. 2. (Sze), 19.55
Kiprobálom majd azt is csak most bajlodik az ssl -el amit nem tud betölteni :) amint ez megvan akkor nyugiban lehet a flusht is probálgatni :)
18

Ja, vannak fontosabb dolgok

inf · 2013. Okt. 2. (Sze), 21.47
Ja, vannak fontosabb dolgok is :-) én pl babylon 5-öt néztem :D a régi sorozatokban valahogy még van történet, a mostaniakat 2 sorban össze lehet foglalni, gondolom azért nem is húzzák valami sokáig őket, elfogy a nézettség, megvonják a támogatást 2 évad után, aztán vége...
19

Zárni lehet a topicot

skull87 · 2013. Okt. 4. (P), 13.24
Zárni lehet a topicot :D

Köszönöm!
20

Itt nem szokás lezárni, nem

inf · 2013. Okt. 4. (P), 20.34
Itt nem szokás lezárni, nem is hiszem, hogy van ilyen feature a rendszerben :D
21

Drupal

Pepita · 2013. Okt. 5. (Szo), 02.02
Ha a kommentek számát lehet állítani, gondolom lezárni is lehet. De akkor hova spammelnének? :)
22

Hát én Ádámot kérdezném, ő

inf · 2013. Okt. 5. (Szo), 02.37
Hát én Ádámot kérdezném, ő jobban tudja, hogy mit lehet és mit nem ebben a rendszerben. Annyit tudok, hogy nincs ilyen jogköröm.
23

Ha tudod szerkeszteni magát a

pp · 2013. Okt. 5. (Szo), 05.56
Ha tudod szerkeszteni magát a node-ot, jelen esetben a fórum indító hozzászólást, akkor ott a hozzászólásoknál be lehet állítani, hogy csak olvashatóak legyenek a hozzászólások, kvázi lezárva ezzel a topic-ot.

pp
24

És tényleg :D Hogy mik vannak

inf · 2013. Okt. 5. (Szo), 06.32
És tényleg :D Hogy mik vannak :D
25

okés, nem tudtam :D

skull87 · 2013. Okt. 5. (Szo), 21.16
okés, nem tudtam :D
26

ugy tünik elöjött egy másik

skull87 · 2013. Okt. 10. (Cs), 12.24
ugy tünik elöjött egy másik hiba ugyan ezzel a scriptel :)
ha kiprobálom akkor a login oldal jön elő, de ez nekem nem jó mert webcronban akkor nem fog lefutni, persze ha beirom a usert és passt lefut a script.

A user és pass a scriptben megvan adva az 54 -ik sorban aut_user és auth_pass kitöltöttem a megfelelő adatokkal de mintha soron kivül hagyná mert ugyan az a login oldal jön be.
28

A 251-edik sorban be van

vrnagy · 2013. Okt. 10. (Cs), 15.02
A 251-edik sorban be van allitva egy "basic" login, ez azt jelenti, hogy nem egy login form jon be, hanem a bongeszo ker egy felhasznalonevet es jelszot (HTTP auth)?
Ha igen akkor az URL-t megadhatod http://felhasznalo:jelszo@eredetiurl formaban is, es akkor nem fog jelszot kerni.