@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');


Подскажите пожалуйста, как исправить проблему. Заранее спасибо.
  • Вопрос задан
  • 2353 просмотра
Пригласить эксперта
Ответы на вопрос 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
нельзя просто так взять и загуглить ошибку
Почему бы не создавать один файл для одного задания? И запоминать его название, чтобы потом переписать или удалить.
Ответ написан
Ваш ответ на вопрос

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

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