LINUX.ORG.RU

Какие и как нужно выдать права (и кому), чтобы systemd запускал bash скрипт, который дёргает php?

 , ,


0

1

схема: systemd сервис каждые 10 минут обращается к bash скрипту, который в свою очередь обращается к php. Задача PHP скрипта скачать видео, обработать его и отправить.

cronbot.service

[Unit]
Description=cronbot online service
[Service]
Type=simple
ExecStart=/var/www/domain.com/bashtophp.sh

cronbot.timer

Description=CronBOT Run every 10 minutes
[Timer]
OnBootSec=1min
OnUnitActiveSec=10min
Unit=cronbot.service
[Install]
WantedBy=multi-user.target

BASH

#!/bin/bash
php -f /var/www/domain.com/camengine.php true

Если открыть скрипт (сайт) через браузер, то всё отработает нормально, но если запустить сервис cronbot.service (или просто запустить из консоли php -f /var/www/domain.com/camengine.php true</code>), то будет вот такая ошибка:

PHP Warning:  file_put_contents(video/20.16.44-20.17.18[M][0@0][0].dav): Failed to open stream: No such file or directory in /var/www/domain.com/camengine.php on line 397
<br />
<b>Warning</b>:  file_put_contents(video/20.16.44-20.17.18[M][0@0][0].dav): Failed to open stream: No such file or directory in <b>/var/www/domain.com/camengine.php</b> on line <b>397</b><br />

То есть файл не может записаться… или не записаться… я не знаю

root@stockholm:~# ls -l /var/www/domain.com/
total 64
-rwxr-xr-x 1 root     root        61 Jan  4 20:25 bashtophp.sh
-rw-r--r-- 1 root     root      6760 Jan  4 20:01 cambot.php
-rw-r--r-- 1 root     root     37157 Jan  4 20:15 camengine.php
-rw-r--r-- 1 www-data www-data    23 Jan  4 15:41 index.php
-rw-r--r-- 1 www-data www-data    26 Jan  4 16:08 robots.txt
drwxrwxrwx 2 www-data www-data  4096 Jan  4 20:40 video

Как видите, пытался выбрать права 777 для папки video - не помогло. Скажите, куда копать?

Ответ на: комментарий от Anoxemian

Надо выдумать какие-то безумные идеи и вибирать права 777.

это посоветовали на stackoverflow.com.

выдача прав - временная попытка выяснить, действительно ли не хватает папке прав.

accountnujen
() автор топика

file_put_contents(video/20.16.44-20.17.18[M][0@0][0].dav)

Это путь от текущей директории, вам нужно в системд юните или баш скрипте (или пхп скрипте)) выставить текущую директорию.

goingUp ★★★★★
()
Последнее исправление: goingUp (всего исправлений: 1)
Ответ на: комментарий от accountnujen

мне нужен был крон.

Поэтому полез куда угодно, лишь бы не в крон 🤦‍♂️

чтобы не было преград в правах

Говорят бестелесные духи преград не имеют, попробуйте самовыпилиться. 🤦‍♂️

ничего...

А вот надо знать, а не искать решение проблемы там где и проблемы то нет. Возвращаясь к аналогии с бесплотным духом, это как самовыпилиться чтобы не чесать зачесавшуюся пятку.

erfea ★★★★★
()
Ответ на: комментарий от goingUp

Это путь от текущей директории, вам нужно в системд юните или баш скрипте (или пхп скрипте)) выставить текущую директорию.

не понял вас. Этот путь относительно php скрипта. Можете подробнее пожалуйста сказать, что нужно делать?

accountnujen
() автор топика
Ответ на: комментарий от erfea

А вот надо знать

Мне как истину от лжи отличать? Статья в интернете говорит, что cron использовать не нужно, используй systemd, если хочешь что-то постоянно перезапускать. вы вместо того, чтобы язвить - решение лучше бы предложили

accountnujen
() автор топика
Ответ на: комментарий от accountnujen

Мне как истину от лжи отличать?

Пользоваться критическим мышлением.

вы вместо того, чтобы язвить - решение лучше бы предложили

Уже предложил. 1 использовать долбаный крон, 2 не использовать рута, 3 курить про чёртов pwd (зы последнее не я один предложил). ЗЫ я тут в единственном числе.

erfea ★★★★★
()
Ответ на: комментарий от accountnujen

Статья в интернете говорит, что cron использовать не нужно, используй systemd

Всё верно статья говорит. Но нужно или использовать пользовательский инстанс systemd или прописать User и Group в файле сервиса. Также нужно прописать WorkingDirectory чтобы не было проблемы с относительными путями. Ну и оборачивать php скрипт в баш тоже необязательно, запускай php прямо из systemd.

eternal_sorrow ★★★★★
()
Ответ на: комментарий от accountnujen

выдача прав - временная попытка выяснить, действительно ли не хватает папке прав.

Ну во первых, это не тробовалось, если бы не хватало прав, ошибки были бы другими (Permission Denied или что то вроде того). Во вторых, НИКОГДА так не делай, даже если и правда есть проблема с правами. Иди и верни права как были прямо сейчас.

eternal_sorrow ★★★★★
()
Последнее исправление: eternal_sorrow (всего исправлений: 2)
Ответ на: комментарий от goingUp

Нет. Есть концепция «текущей директории». Вставьте в ваш shell скрипт перед запуском php

да, запустилось. У меня сервис, в котором указан полный путь до bash скрипта. У меня есть bash скрипт, в котором указан полный путь до php скрипта Почему php не может плясать от туда, где он лежит?

Что я должен прописать в баш скрипте или в сервисе?

accountnujen
() автор топика
Ответ на: комментарий от accountnujen

Почему php не может плясать от туда, где он лежит?

Потому что вещи работают определенным образом. Вы веб-разработчик? Админ и девопс не может не знать о текущей директории. Читайте про текущую директорию, абсолютный и относительный путь. Веб-сервер вам выставлял текущую директорию в документ рут (не путь скрипта!), чтобы это делал системд юнит его нужно об этом попросить.

goingUp ★★★★★
()
Ответ на: комментарий от eternal_sorrow

Действительно зачем использовать индустриальный стандарт, когда есть модный хипстерский ни с чем не совместимый инит, разрабы которого о себе более чем дохрена возомнили и который стал всем вообще. Затащим его вместо крона! Ещё рекомендую выкинуть nginx, systemd же умеет http соединения принимать, захрена нам всякое легаси?! Пора сделать regeditd и powersupershelld, тогда точно веденкапец. 😂

erfea ★★★★★
()
Ответ на: комментарий от accountnujen

Почему php не может плясать от туда, где он лежит?

Потому что php - язык программирования, это инструмент которым работает программист. ЯП ни от чего не пляшет. Программист может плясать как откуда лежит скрипт, так от текущей рабочей директории, так хоть от погоды на марсе. Ваш скрипт пляшет от того, от чего ему сказал плясать автор кода (явно или нет, не важно).

erfea ★★★★★
()
Последнее исправление: erfea (всего исправлений: 1)
Ответ на: комментарий от goingUp

Админ и девопс не может не знать о текущей директории. Читайте про текущую директорию, абсолютный и относительный путь.

смотрите, если я меняю скрипт и прописываю вместо «video/$file» -> «/video/$file» - всё начинает работать. Но это оно работает в текущих условиях.

camengine.php лежит в корне рядом с папкой видео. Но если мы возьмём и переместим всё это добро в папку «script», тогда этот путь «/video/$file» не будет работать, потому что этой папки нет. Я всегда знаю, что папка video находится рядом со скриптом, то есть я знаю её относительный путь. В этих условиях, что я должен сделать, чтобы адрес «video/$file» был валидный? Может быть у команды php в linux есть какой-то флаг, который говорит, чтобы выполнение происходило относительно скрипта, а не относительно того, где я в этот момент нахожусь?

accountnujen
() автор топика
Ответ на: комментарий от erfea

Ну в системд есть фичи, типа не запускать скрипт повторно, если уже работает одна копия, установить макс время выполнения, прибивать скрипт, если он долго не выдавал выхлопа и т.д., так что в статье его могли рекомендовать из-за этого)

goingUp ★★★★★
()
Ответ на: комментарий от EXL

А вот выучил бы Python, не было бы этих глупых обёрток PHP в Bash.

Год только начался, а коммент года уже готов. Ты предлагаешь ТСу завернуть вызов bash в python? Т.е. глупую обертку превратить в дибильную?

Anoxemian ★★★★★
()
Ответ на: комментарий от erfea

Во всём миллионе дистров

Точно? Проверял? Некоторые ради легаси тащат systemd-cron (обёртка, генерерирующая таймеры systemd из кронтаба). В других и от этого отказались. Для желающих конечно можно поставить крон из репозитория, но по дефолту рекомендуется писать таймеры.

юнтксов

Кого они волнуют?

eternal_sorrow ★★★★★
()
Последнее исправление: eternal_sorrow (всего исправлений: 1)
Ответ на: комментарий от eternal_sorrow

Не поверишь. А ещё проверял в не gnu/linux, там такое адское легаси, там вообще systemd нету. И прикинь, оно ВНЕЗАПНО живёт. А прикинь в некоторых на выбор есть другие иниты и systemd не по-дефолту. ПРИКИНЬ!

Некоторые ради легаси тащат systemd-cron

ПРИКИНЬ! Крон то индустриальный стандарт оказывается. И ПРИКИНЬ кстати конкретная реализация вообще не важна, в хендбуке генты про выбор конкретного крона было написано ещё когда ты не то пешком под стол ходил, не то вообще в планах не существовал.

erfea ★★★★★
()
Ответ на: комментарий от Anoxemian

Ты предлагаешь ТСу завернуть вызов bash в python? Т.е. глупую обертку превратить в дибильную?

Да, я предлагаю сделать так: systemd вызывает Python, который вызывает Bash, который вызывает PHP.

А если серьёзно, то наверняка всю ту функциональность, которая скрывается в файле camengine.php можно быстро переписать на Python со всеми его батарейками по типу beautifulsoup и обернуть этот deamon в unit/timer для systemd, избавившись как от PHP, так и от Bash (о господи!).

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 2)
Ответ на: комментарий от erfea

юнтксов

не gnu/linux

в некоторых на выбор есть другие иниты

Перечислил всякую маргинальщину, а задвигаешь про стандарт.

Крон то индустриальный стандарт оказывается.

Откуда такой вывод? Что тебе непонятно в слове «легаси»? Когда то он был стандартом, да, а теперь наследие тех времён приходится тащить.

ещё когда ты не то пешком под стол ходил

В 80е существовала гента? Не знал.

eternal_sorrow ★★★★★
()
Ответ на: комментарий от Anoxemian

Python далеко не лучший выбор для написания скриптов, которые должны запускаться «по крону».

В случае ТС этот язык для решения его задачи уж будет явно получше чем PHP.

У ТСа вообще другая задача.

Ага, я вижу. ТС вот прямо сейчас переключился с проблемы запуска скрипта по таймеру на проблему того почему скрипт из браузера у него работает, а скрипт через php -f внезапно не работает. В общем, создал себе траблы на ровном месте и героически их решает уже сутки. А на деле там окажется какая-то ахинея вроде той, что скрипт из-под браузера запускается под каким-нибудь юзером php-fpm, а он в юните запускает его под системным юзером. Всё это можно было бы избежать, если бы он выбрал другой стек технологий для этой задачи. Ну а Web-морду, кстати, вполне мог наваять и на PHP.

EXL ★★★★★
()

Заводишь пользователя, кладешь в /home/<username>/script.php. Добавляешь в 1 строку скрипта. #/чегототам/php

Дальше добавляешь это все в крон, работает! Ни системд ни мучений с правами тебе не нужны.

ggrn ★★★★★
()
Ответ на: комментарий от EXL

Ага, я вижу. ТС вот прямо сейчас переключился с проблемы запуска скрипта по таймеру на проблему того почему скрипт из браузера у него работает, а скрипт через python3.8, внезапно, не работает. В общем, создал себе траблы на ровном месте и героически их решает уже сутки. А на деле там окажется какая-то ахинея вроде той, что скрипт из-под браузера запускается под каким-нибудь юзером mod_wsgi, а он в юните запускает его под системным юзером. Всё это можно было бы избежать, если бы он выбрал другой стек технологий для этой задачи. Ну а Web-морду, кстати, вполне мог наваять и на Python.

Еще раз. Никакого смысла для задачи ТС твой блуд про пистон не представляет.

Anoxemian ★★★★★
()
Ответ на: комментарий от Anoxemian

Никакого смысла для задачи ТС твой блуд про пистон не представляет.

Да мой блуд про пистон хотя бы направляет начинающего программиста в сторону правильного подхода к решению задачи, а не вот этого вот случившегося: «наговнякал на похапэ, из браузера робит, а из php -f не хотит, chmod 777 зделол, памагите».

И кстати, судя по задаче я подозреваю что там вообще можно было обойтись последовательным вызовами wget, ffmpeg, imagemagick и curl действительно завёрнутыми в Bash-скрипт.

EXL ★★★★★
()