/**
*
* Created by PHPStorm
* User: zhanghao
* Date: 2019-12-5 0005$
* Time: 17:03$
* Email: <[email protected]>
*/
namespace app\common\Util;
class Crontab
{
/**
* 测试
*/
private function test()
{
$cron = new Crontab();
$i = (string)(int)date('i', time());
$h = (string)(int)date('H', time());
$d = '*';
$m = '*';
$dow = '1-5';
$command = config('timing_switch') . 43961;
$cron_command = "$i $h $d $m $dow $command";
//创建
$info = $cron->append_cronjob($cron_command);
//删除
$info2 = $cron->del_designated_cron(43961, 'spring');
//更新
$info3 = $cron->update_designated_cron(43961, 'spring', $cron_command);
}
/**
* 添加定时推送
* @param $command
* @return bool
*/
public function cronjob_exists($command): bool
{
$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;
}
/**
* 追加
* @param $command
* @return array
*/
public function append_cronjob($command): array
{
if (is_string($command) && !empty($command) && $this->cronjob_exists($command) === FALSE) {
//add job to crontab
exec('echo -e "`crontab -l`\n' . $command . '" | crontab -', $output);
}
return ['command' => $command, 'status' => empty($output) ? 0 : 1, 'linux_user' => exec('whoami')];
}
/**
* 删除全部
*/
public function del_cron()
{
exec('crontab -r', $crontab);
}
/**
* 删除单条定时任务
* 19 10 * * 1-5 curl banpai.yuezhix.com/api/timing/switches/id/43969
* 如上行定时命令 中 43969 就是要传递的$id
* @param $id : ban_timing_log 表中的ID ,
* @param $user : 创建命令的用户,apache执行用户 (www) ban_timing_log 表中的linux_user ,
* 不是上一条命令,是这个通知的上一次定时任务,是可以在表中查看到的
*/
public function del_designated_cron($id, $user)
{
exec(' sed -i \'/' . $id . '/d\' /var/spool/cron/crontabs/' . $user, $x);
exec(' /etc/init.d/cron reload' , $x);
}
/**
* 更新指定定时任务
* @param $id
* @param $user
* @param $command
这个方法没有用, 修改文件后不起作用,使用下面的方法
*/
public function update_designated_cron_old($id, $user, $command)
{
exec(' sed -i \'/' . $id . '/c ' . $command . '\' /var/spool/cron/crontabs/' . $user, $x);
exec(' /etc/init.d/cron reload' , $x);
}
/**
* 更新指定定时任务
这个方法 属实是可以进行修改
* @param $id
* @param $user
* @param $command
*/
public function update_designated_cron($id, $user, $command)
{
$this->del_designated_cron($id, $user);
$this->append_cronjob($command);
}
}