I'm moving from a webserver with CPanel to one with Plesk. Under Cpanel, it's fairly simple to create and remove cronjobs with php:
<?php
// Create cron
$new_cron = "30 * * * * cd /home/account/public_html/; /usr/local/bin/php -f controller.php ".$argument1.PHP_EOL;
$output = shell_exec('crontab -l');
file_put_contents('/tmp/crontab.txt', $output.$new_cron);
exec('crontab /tmp/crontab.txt');
// Remove cron
$cronjob = "30 * * * * cd /home/account/public_html/; /usr/local/bin/php -f controller.php ".$argument1.PHP_EOL;
$output = shell_exec('crontab -l'); // pull current cron jobs
if (strstr($output, $cronjob)) // found
{
$newcron = str_replace($cronjob,"",$output); // delete it
file_put_contents('../tmp/crontab.txt', $newcron.PHP_EOL); // Save
exec('crontab ../tmp/crontab.txt'); // Send back
}
?>
Under Plesk I have scheduled tasks. How do I use PHP to create and remove those? Or is there another method?
You can schedule task at Home > Subscriptions > example.tld > Scheduled Tasks:
Since Plesk 12.5 there are options of task type:
Related
I've found at this forum that it is possible to edit crontab like this:
a. crontab -l > $tmpfile
b. edit $tmpfile
c. crontab $tmpfile
d. rm $tmpfile
So, I'm trying to implement this solution on php:
include('Net/SSH2.php');
$ssh = new Net_SSH2('myhost');
if (!$ssh->login('user', 'password'))
{
echo'Login Failed';
}
$ssh->exec('crontab -l > /var/www/tmp.txt');
$content=file_get_contents("/var/www/tmp.txt");
$content.='0 0 1 * * /usr/bin/php /var/www/clearPreviousMonth1.php';
$file=fopen("/var/www/tmp.txt", "w");
fputs($file,$content);
fclose($file);
$ssh->exec('crontab /var/www/tmp.txt');
echo $content;
I can see edited content of crontab in my browser and tmp file, but when I use crontab -e it's not changed. What's my mistake?
I had to add new string before the end of file. In other case it's not added to crontab.
changed $content.='0 0 1 * * /usr/bin/php /var/www/clearPreviousMonth1.php';
to $content.="0 0 1 * * /usr/bin/php /var/www/clearPreviousMonth1.php\n";
note that it's neccessary to use " instead of ', because it just will append \n symbols to last string
Basically I have developed a small script that adds a cron job into a file called "crontask" and then I want to execute it so then it becomes a cron job. Here is the script:
<?php
$filename = "../../tmp/crontask.txt";
$output = shell_exec('crontab -l');
$something = file_put_contents($filename, $output.'* * * * * NEW_CRON'.PHP_EOL);
$cngDir = chdir('../../tmp/');
echo exec('crontab ' . getcwd() . '/crontask.txt');
//var_dump($exe);
?>
Everything is ok, the path is the same and if I copy and paste the path that prints out IT will carry out the cronjob but in PHP it won't???
Everything works, apart from the exec function, it doesn't execute it. Any ideas?
In terminal, if I do:
string(25) "crontab /tmp/crontask.txt"
it will execute it.
Try the following things:
Call to the command using the full command path. Sometimes $PATH is not set in the script environment and can't find the command if not.
Setup the working dir of the script using http://php.net/manual/en/function.chdir.php
Use the absolute path to access to the file
I've had a similar issue with cron jobs
I looked at your code and got a couple of ideas.
I used absolute paths
Here is my code:
$myFile = "/home/user/tmp/crontab.txt";
$addcron = "
0 0 * * * cronjob1 " . PHP_EOL .
"0 18 * * 1-5 conjob2 " . PHP_EOL .
"0 9 * * * cronjob3 " . PHP_EOL ;
$output = exec('crontab -l > ' . $myFile );
file_put_contents($myFile,$addcron ,FILE_APPEND);
echo exec('crontab ' . $myFile );
echo "<h3>Cron job successfully added!</h3>";enter code here
basically i wrote the list of previous cronjobs to a file and then appended the file with new cronjobs. Then added the new list of cronjobs with the crontab command.
the linux write to file command ' > ' was what did the trick ;)
cron line look's like:
*/1 * * * * /usr/bin/php /path/to/CRON.php > /path/to/log/CRON_LOG.txt 2> /dev/null
CRON.php
<?php
require_once 'config.php';
define('CRON', dirname(dirname(__FILE__)));
$parts = explode("/",__FILE__);
$ThisFile = $parts[count($parts) - 1];
chdir(substr(__FILE__,0,(strlen(__FILE__) - strlen($ThisFile))));
unset($parts);
unset($ThisFile);
$CRON_OUTPUT = "STARTING CRON # ".date("m-d-Y H:i:s")."\r\n";
$CRON_OUTPUT .= CleanLog() . "\r\n";
$CRON_OUTPUT .= "\r\n";
echo $CRON_OUTPUT;
$fh = fopen(''.CRON.'/log/CRON_LOG.txt', 'a');
fwrite($fh, $CRON_OUTPUT);
fclose($fh);
die();
?>
CleanLog function:
global $db;
$resp = '';
$db->query('SQL');
$resp = 'Deleted '.$db->rows_affected.' entries from table';
return $resp;
In file only these two lines showing and function by the time as i can see executed two times:
CRON_LOG.txt
STARTING CRON # 02-26-2012 21:26:01
Deleted 0 entries from table
STARTING CRON # 02-26-2012 21:26:01
Deleted 0 entries from table
What's wrong with it, why it only produce those lines and file doesn't updated (in file only date/time changing, nothing more, it should add more lines and even file size should grow up) ?
You should be using >> for redirection to append to the file, rather than > which overwrites the log each time the script runs.
*/1 * * * * /usr/bin/php /path/to/CRON.php >> /path/to/log/CRON_LOG.txt 2> /dev/null
##---------------------------------------^^^^^^
There really isn't any need to do fopen()/fwrite() inside the script itself, since the cron job is already handling the output redirection.
I am trying to replace the crontab using a new crontab stored at /tmp/crontab.txt.
$output = '';
$output .= "Existing Crontab contents:<br>";
$output .= shell_exec('crontab -l');
$output .= "<br>new contents:<br>";
$output .= file_get_contents('/tmp/crontab.txt');
$output .= "<br>Result of import:<br>";
$output .= shell_exec('crontab /tmp/crontab.txt');
$output .= shell_exec('crontab -l');
echo $output;
The output is:
Existing Crontab contents:
1 2 3 4 5 existing
new contents:
* * * * * echo 'test'
Result of import:
1 2 3 4 5 existing
You can see the import does not work and does not show an error.
Apache is running as 'nobody'. I have tried crontab -u nobody /tmp/crontab.txt as root and it works.
Is this a permissions issue? If so, why is php (running as nobody) unable to update it's own cron? How do I get around this?
Thanks
Try changing your import line to this:
$output .= shell_exec('crontab /tmp/crontab.txt 2>&1');
that'll redirect stderr to stdout and let PHP catch any error message cron's spitting out.
What I have so far is
#!/bin/sh
php_syntax_check()
{
retval=0
for i in $(git-diff-index --name-only --cached HEAD -- | grep -e '\.php$'); do
if [ -f $i ]; then
output=$(php -l $i)
retval=$?
if [ $retval -gt 0 ]; then
echo "=============================================================================="
echo "Unstaging $i for the commit due to the follow parse errors"
echo "$output"
git reset -q HEAD $i
fi
fi
done
if [ $retval -gt 0 ]; then
exit $retval
fi
}
php_syntax_check
If the commit is a partial commit (not all the changes in the working tree are committed), then this make give incorrect results since it tests the working copy and not the staged copy.
One way to do this could be:
git diff --cached --name-only --diff-filter=ACMR | xargs git checkout-index --prefix=$TMPDIR/ --
find $TMPDIR -name '*.php' -print | xargs -n 1 php -l
Which would make a copy of the staged images into a scratch space and then run the test command on them there. If any of the files include other files in the build then you may have to recreate the whole staged image in the test tree and then test the changed files there (See: Git pre-commit hook : changed/added files).
I'm sorry if it's offtopic, but aren't you supposed to run some kind of automated tests (which would imply that the code has no syntax errors) before doing a commit?
If you've got the php5-cli installed you can write your pre-commit in PHP and use the syntax your more familiar with.
Just do something more like.
#!/usr/bin/php
<?php /* Your pre-commit check. */ ?>
My PHP implementation of the pre-commit hook checks whether the modified files in git are 'error free' and are as per PSR2 standard using either 'php-code-sniffer' or 'php-cs-fixer'
#!/usr/local/bin/php
<?php
/**
* Collect all files which have been added, copied or
* modified and store them in an array - output
*/
exec('git diff --cached --name-only --diff-filter=ACM', $output);
$isViolated = 0;
$violatedFiles = array();
// $php_cs_path = "/usr/local/bin/php-cs-fixer";
$php_cs_path = "~/.composer/vendor/bin/phpcs";
foreach ($output as $fileName) {
// Consider only PHP file for processing
if (pathinfo($fileName, PATHINFO_EXTENSION) == "php") {
$psr_output = array();
// Put the changes to be made in $psr_output, if not as per PSR2 standard
// php-cs-fixer
// exec("{$php_cs_path} fix {$fileName} --rules=#PSR2 --dry-run --diff", $psr_output, $return);
// php-code-sniffer
exec("{$php_cs_path} --standard=PSR2 --colors -n {$fileName}", $psr_output, $return);
if ($return != 0) {
$isViolated = 1;
$violatedFiles[] = $fileName;
echo implode("\n", $psr_output), "\n";
}
}
}
if ($isViolated == 1) {
echo "\n---------------------------- IMPORTANT --------------------------------\n";
echo "\nPlease use the suggestions above to fix the code in the following file: \n";
echo " => " . implode("\n => ", $violatedFiles);
echo "\n-----------------------------------------------------------------------\n\n\n";
exit(1);
} else {
echo "\n => Committed Successfully :-)\n\n";
exit(0);
}