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

Не могу понять, почему скрипт очищает весь крон, место удаления конкретной строки, как сделать правильно?

Есть скрипт, который должен удалять из крона одну конкретную строку, но по непонятной причине, он очищает все строки в кроне, никак не могу понять в чем же ошибка.
Вот кусок отвечающий за это
$connect = ssh2_connect('localhost', '22');
        ssh2_auth_password($connect, ssh_login, ssh_password);
        $stream = ssh2_exec($connect,'cat /var/spool/cron/crontabs/deone');
        stream_set_blocking($stream, true);
        $path_script = 'user_'.$_SESSION['id'].'_job_'.$id.'.php';
        $stream = stream_get_contents($stream);
        $stream = str_replace('* * * * * /home/jitter.sh; /usr/bin/flock -xn /tmp/'.$path_script.'.lock -c \'/usr/bin/php -q /var/www/deone/data/www/vk-manager.ru/script/grabber/'.$path_script.' >/dev/null 2>&1\'', '', $stream);
        ssh2_exec($connect,'echo -n > /var/spool/cron/crontabs/deone');
        ssh2_exec($connect, 'echo "'.$stream.'">> /var/spool/cron/crontabs/deone');
        ssh2_exec($connect, '/etc/init.d/cron restart');        
        }
    }
    $mysqli->close();

В таком виде в кроне лежат строки
* * * * * /home/jitter.sh; /usr/bin/flock -xn /tmp/user_751_job_11101.php.lock -c '/usr/bin/php -q /var/www/deone/data/www/vk-manager.ru/script/grabber/user_751_job_11101.php >/dev/null 2>&1'


А вот старый код, который вроде как работал когда-то правильно
$connect = ssh2_connect('localhost', '22');
        ssh2_auth_password($connect, ssh_login, ssh_password);
        $stream = ssh2_exec($connect,'cat /var/spool/cron/crontabs/deone');
        stream_set_blocking($stream, true);
        $stream = stream_get_contents($stream);
        $path_script = 'grabber/user_'.$_SESSION['id'].'_job_'.$id.'.php';
        $stream = str_replace("*	*	*	*	*	/usr/bin/php -q /var/www/deone/data/www/vk-manager.ru/script/".$path_script." >/dev/null 2>&1\n",'',$stream);
        ssh2_exec($connect,'echo -n > /var/spool/cron/crontabs/deone');
        ssh2_exec($connect, 'echo "'.$stream.'">> /var/spool/cron/crontabs/deone');
        ssh2_exec($connect, '\etc\init.d\cron restart');


Подскажите пожалуйста, как исправить проблему. Заранее спасибо.
  • Вопрос задан
  • 2356 просмотров
Подписаться 2 Оценить Комментировать
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 2
valerium
@valerium
Изобретая велосипед
Вообще да, сделано дико криво. Сначала скрипт забирает файл с сервера, потом обрабатывает его на своей стороне, потом весь же файл передаёт обратно. Не проще ли «точечно» обработать файл на стороне сервера? Есть же волшебная утилита sed!

$connect = ssh2_connect('localhost', '22');
ssh2_auth_password($connect, ssh_login, ssh_password);
$stream = ssh2_exec($connect,"sed -i.back 's/* * * * * /home/jitter.sh; /usr/bin/flock -xn /tmp/$path_script.lock -c \'/usr/bin/php -q /var/www/deone/data/www/vk-manager.ru/script/grabber/$path_script >/dev/null 2>&1\'//' /var/spool/cron/crontabs/deone");
ssh2_exec($connect, '/etc/init.d/cron restart');


То есть потоковый редактор sed (волшебная вещь! очень советую изучить) удаляет одну строку в файле, при этом (на всякий случай) создаёт резервную копию исходного файла с суффиксом .back.

Кстати, судя по всему, подключение идёт к рутовой записи по паролю, это совершенно несекурно. Представляете, кто-то украдёт Ваш скрипт? Заморочтесь и настройте sudo и авторизацию по ключу.

И да, надеюсь, localhost — это просто замена для конфиденциальности?
Ответ написан
Комментировать
Sanasol
@Sanasol Куратор тега PHP
нельзя просто так взять и загуглить ошибку
Почему бы не создавать один файл для одного задания? И запоминать его название, чтобы потом переписать или удалить.
Ответ написан
Ваш ответ на вопрос

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

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