是否可以使用 PHP 来创建、编辑和删除 crontab 作业?
我知道如何列出 Apache 用户当前的 crontab 作业:
$output = shell_exec('crontab -l');
echo $output;
但是如何用 PHP 添加一个 cron 任务呢? 'crontab -e' 只会打开一个文本编辑器,您必须在保存文件之前手动编辑条目。
以及如何使用 PHP 删除 cron 作业?同样,您必须通过“crontab -e”手动执行此操作。
使用这样的作业字符串:
$job = '0 */2 * * * /usr/bin/php5 /home/user1/work.php';
如何使用 PHP 将其添加到 crontab 作业列表中?
crontab 命令用法
usage: crontab [-u user] file
crontab [-u user] [ -e | -l | -r ]
(default operation is replace, per 1003.2)
-e (edit user's crontab)
-l (list user's crontab)
-r (delete user's crontab)
-i (prompt before deleting user's crontab)
所以,
$output = shell_exec('crontab -l');
file_put_contents('/tmp/crontab.txt', $output.'* * * * * NEW_CRON'.PHP_EOL);
echo exec('crontab /tmp/crontab.txt');
如果用户具有足够的文件写入权限,则上述内容可用于创建和编辑/追加。
要删除作业:
echo exec('crontab -r');
另外,请注意 apache 以特定用户身份运行,并且通常不是 root,这意味着只能为 apache 用户更改 cron 作业,除非将 crontab -u
权限授予 apache 用户。
我们最近准备了一个小型项目 (PHP>=5.3) 来管理私人和个人任务的 cron 文件。此工具连接和管理 cron 文件,以便您可以使用它们,例如每个项目。可用的单元测试:-)
命令行示例:
bin/cronman --enable /var/www/myproject/.cronfile --user www-data
来自 API 的示例:
use php\manager\crontab\CrontabManager;
$crontab = new CrontabManager();
$crontab->enableOrUpdate('/tmp/my/crontab.txt');
$crontab->save();
从 API 管理单个任务:
use php\manager\crontab\CrontabManager;
$crontab = new CrontabManager();
$job = $crontab->newJob();
$job->on('* * * * *');
$job->onMinute('20-30')->doJob("echo foo");
$crontab->add($job);
$job->onMinute('35-40')->doJob("echo bar");
$crontab->add($job);
$crontab->save();
github:php-crontab-manager
检查一个 cronjob
function cronjob_exists($command){
$cronjob_exists=false;
exec('crontab -l', $crontab);
if(isset($crontab)&&is_array($crontab)){
$crontab = array_flip($crontab);
if(isset($crontab[$command])){
$cronjob_exists=true;
}
}
return $cronjob_exists;
}
附加一个 cronjob
function append_cronjob($command){
if(is_string($command)&&!empty($command)&&cronjob_exists($command)===FALSE){
//add job to crontab
exec('echo -e "`crontab -l`\n'.$command.'" | crontab -', $output);
}
return $output;
}
删除一个 crontab
exec('crontab -r', $crontab);
例子
exec('crontab -r', $crontab);
append_cronjob('* * * * * curl -s http://localhost/cron/test1.php');
append_cronjob('* * * * * curl -s http://localhost/cron/test2.php');
append_cronjob('* * * * * curl -s http://localhost/cron/test3.php');
crontab -l
\n'.$command.'" | crontab -', $output);这是对的吗。我没有得到 www-data "-":0 的 crontab:crontab 文件中的错误分钟错误,无法安装。
这应该这样做
shell_exec("crontab -l | { cat; echo '*/1 * * * * command'; } |crontab -");
我尝试了下面的解决方案
class Crontab {
// In this class, array instead of string would be the standard input / output format.
// Legacy way to add a job:
// $output = shell_exec('(crontab -l; echo "'.$job.'") | crontab -');
static private function stringToArray($jobs = '') {
$array = explode("\r\n", trim($jobs)); // trim() gets rid of the last \r\n
foreach ($array as $key => $item) {
if ($item == '') {
unset($array[$key]);
}
}
return $array;
}
static private function arrayToString($jobs = array()) {
$string = implode("\r\n", $jobs);
return $string;
}
static public function getJobs() {
$output = shell_exec('crontab -l');
return self::stringToArray($output);
}
static public function saveJobs($jobs = array()) {
$output = shell_exec('echo "'.self::arrayToString($jobs).'" | crontab -');
return $output;
}
static public function doesJobExist($job = '') {
$jobs = self::getJobs();
if (in_array($job, $jobs)) {
return true;
} else {
return false;
}
}
static public function addJob($job = '') {
if (self::doesJobExist($job)) {
return false;
} else {
$jobs = self::getJobs();
$jobs[] = $job;
return self::saveJobs($jobs);
}
}
static public function removeJob($job = '') {
if (self::doesJobExist($job)) {
$jobs = self::getJobs();
unset($jobs[array_search($job, $jobs)]);
return self::saveJobs($jobs);
} else {
return false;
}
}
}
归功于:Crontab Class to Add, Edit and Remove Cron Jobs
您可以尝试使用 ed
之类的内容覆盖 EDITOR
环境变量,这可以通过标准输入接受一系列编辑命令。
取决于您存储 crontab 的位置:
shell_exec('echo "'. $job .'" >> crontab');
您可以将文件以 cron 格式放入 /etc/cron.d/。为文件名添加一些唯一前缀 要列出特定于脚本的 cron 作业,只需使用具有唯一前缀的文件列表即可。当您要禁用作业时删除文件。
很好...试试这个来删除一个特定的 cron 作业(经过测试)。
<?php $output = shell_exec('crontab -l'); ?>
<?php $cron_file = "/tmp/crontab.txt"; ?>
<!-- Execute script when form is submitted -->
<?php if(isset($_POST['add_cron'])) { ?>
<!-- Add new cron job -->
<?php if(!empty($_POST['add_cron'])) { ?>
<?php file_put_contents($cron_file, $output.$_POST['add_cron'].PHP_EOL); ?>
<?php } ?>
<!-- Remove cron job -->
<?php if(!empty($_POST['remove_cron'])) { ?>
<?php $remove_cron = str_replace($_POST['remove_cron']."\n", "", $output); ?>
<?php file_put_contents($cron_file, $remove_cron.PHP_EOL); ?>
<?php } ?>
<!-- Remove all cron jobs -->
<?php if(isset($_POST['remove_all_cron'])) { ?>
<?php echo exec("crontab -r"); ?>
<?php } else { ?>
<?php echo exec("crontab $cron_file"); ?>
<?php } ?>
<!-- Reload page to get updated cron jobs -->
<?php $uri = $_SERVER['REQUEST_URI']; ?>
<?php header("Location: $uri"); ?>
<?php exit; ?>
<?php } ?>
<b>Current Cron Jobs:</b><br>
<?php echo nl2br($output); ?>
<h2>Add or Remove Cron Job</h2>
<form method="post" action="<?php $_SERVER['REQUEST_URI']; ?>">
<b>Add New Cron Job:</b><br>
<input type="text" name="add_cron" size="100" placeholder="e.g.: * * * * * /usr/local/bin/php -q /home/username/public_html/my_cron.php"><br>
<b>Remove Cron Job:</b><br>
<input type="text" name="remove_cron" size="100" placeholder="e.g.: * * * * * /usr/local/bin/php -q /home/username/public_html/my_cron.php"><br>
<input type="checkbox" name="remove_all_cron" value="1"> Remove all cron jobs?<br>
<input type="submit"><br>
</form>
header('Location: ...');
之后添加 exit;
。此外,这种形式实际上非常危险,因为它可以添加 cron 作业来“破坏”服务器。
最简单的方法是使用 shell_exec 命令执行 bash 脚本,将值作为参数传递。从那里,您可以像在任何其他非交互式脚本中一样操作 crontab,还可以使用 sudo 等确保您拥有正确的权限。
请参阅此内容,Crontab without crontab -e,了解更多信息。
它很简单你可以卷曲这样做,确保卷曲安装在服务器上:
每分钟触发一次:* * * * * curl --request POST 'https://glassdoor.com/admin/sendBdayNotification'
* 分钟 小时 天 月 周
*
*
*
假设您想每天下午 2:15 发送此通知您可以根据您的 API 更改 POST/GET:
15 14 * * * curl --request POST '你的 API 的 URL'
不定期副业成功案例分享
shell_exec('crontab -l')
只会返回最后一行。我使用了exec('crontab -l', $output)
。然后将 $output 数组内爆成一个字符串(用 \n 作为胶水)。system()
、passthru()
、shell_exec()
和exec()
这样的 shell 命令,请尝试使用主机附带的控制面板,例如 cPanel 或 Plesk。