Запуск исполняемых файлов

Тема в разделе "Как сделать...", создана пользователем HEPB, 8 фев 2012.

  1. HEPB

    HEPB Постоялец

    Регистр.:
    24 июн 2009
    Сообщения:
    111
    Симпатии:
    8
    Подскажите, плиз, как можно из php запустить исполнимые файлы (которые начинаются с диррективы #!/bin/bash)?
    Есть исполнимые файлы, которые лежат в /var/etc и они запускаются по крону раз в 10 мин, что грузит сайт.
    Надо убрать их запуск с крона, а запускать через php? когда пользователь, например что-то изменил в своих данных - в этом случае они должны отработать.
    Сами php файлы лежат в подкаталогах /var/www/...
    Исполнимые файлы - /var/etc/
    Возможно ли их запустить в php?
     
  2. Viodele

    Viodele Механик

    Administrator
    Регистр.:
    17 дек 2011
    Сообщения:
    117
    Симпатии:
    495
    Shell скрипты можно запустить при помощи команд exec(), system() и passthru(). Хотя, у меня есть предположение, что это не решит проблему.
     
  3. Arqin

    Arqin

    Регистр.:
    17 мар 2009
    Сообщения:
    185
    Симпатии:
    37
    А что будет если зайдут 10-20 пользователей одновременно и запустят скрипт по событию?
    Если один исполняемый файл так напрягает систему, что что будет когда их запустится 10? Сайт умрёт?

    В /var/etc/ нужно будет прописать права для пользователя под которым крутится php, чтобы можно было беспрепятственно воспользоваться вышеупомянутыми функциями. Но! Это не желательно, т.к. это есть потенциальная дырка в безопасности.
     
    Viodele нравится это.
  4. HEPB

    HEPB Постоялец

    Регистр.:
    24 июн 2009
    Сообщения:
    111
    Симпатии:
    8
    не, скрипты надо выпонять только когда пользователь купит что-то. А это происходит крайне редко, услуга покупается на месяц вперед как правило и потом уже пользователю уже не нужно что либо запускать.
    Насчет дырки тоже так подумал. А может другой вариант попробовать?
    Скажем пользователь прописывает в таблицу флаг, что надо обновить.
    В кроне надо сделать просмотр этой таблицы и если флаг стоит, то запустить эти shell-скрипты. Крон будет раз в 5 минут читать эту таблицу и если флаг не выставлен - ничего не делать. Так вроде не будет тормозов?
    Только вот как в shell-скрипте обратиться к таблице и если флаг стоит выполнить другой shell-скрипт?
    Буду благодарен за какие-либо примеры.
     
  5. Arqin

    Arqin

    Регистр.:
    17 мар 2009
    Сообщения:
    185
    Симпатии:
    37
    зачем заморачиваться с базой?
    выставляете файл-флаг в файловой системе. к примеру: /tmp/run_update_54454356, где 54454356 - ID юзера. А скриптом своим, который производит обновление смотрите если есть флаги - отрабатываем, нет - умираем. И пусть себе крутится в кроне.
    Только обязательно учтите конкуретный доступ, если будет паралельный запуск скриптов.
     
    HEPB нравится это.
  6. HEPB

    HEPB Постоялец

    Регистр.:
    24 июн 2009
    Сообщения:
    111
    Симпатии:
    8
    то есть в php просто создавать файл?
    Мне даже не важно какой пользователь инициировал запуск.
    Подскажите тогда пример как в shell скрипте посмотреть существует ли файл, может считать с него строки (с тексотового файла), удалить файл.
    Опять же сложность, если все пользователи будут создавать один и тот же файл, то может получиться, что php создать его не сможет или shell - скрипт его удалить.
    А если как вы предлагаете к имени файла приплюсовать id пользователя, то как просматривать такой файл shell-скриптом? Как имя файла в shell-скрипте получить? Просматирвать id юзеров, опять же доступ к базе нужен.
     
  7. uNknownMark

    uNknownMark

    Регистр.:
    22 сен 2007
    Сообщения:
    393
    Симпатии:
    169
    Что мешает проверять в скрипте определенную заранее заданную директорию вне корня веб сервера (что не доступна была снаружи) на предмет наличия файлов. Если они там есть, берем их, парсим (например, из имени файла выкидываем run_update и оставляем только айди пользователя (например, 54454356). После того как получили айди пользователя вызвали на выполненние самму програму и передали в качестве аргумента айди.
    В шелл скрипте не надо смотреть есть файл или нет, надо смотреть в скрипте который будет вызывать программу.
    Вы видимо путаете разные понятия.
    Вряд ли пользователи будут создавать один и тот же файл если в имени файла будет айди пользователя, который скорее всего уникальный. Ну если уж сильно хочется добавляйте к имени файла кроме айди метку времени (time()) она уникальна.
     
  8. HEPB

    HEPB Постоялец

    Регистр.:
    24 июн 2009
    Сообщения:
    111
    Симпатии:
    8
    не, не понял.
    так вызывает прогу как раз таки cron, он запускает shell-скрипт
     
  9. Arqin

    Arqin

    Регистр.:
    17 мар 2009
    Сообщения:
    185
    Симпатии:
    37
    Узнать существует ли файл в shell:
    Код:
    #!/bin/sh
     
    if [ -f filename ]
    then
      echo Cool
    else
      echo sucks
    fi
    Если не надо, чтобы несколько раз запускался скрипт выставляешь еще один файл-флаг на то, что скрипт уже работает. Ну вот как-то так...
     
    HEPB нравится это.