Nano Hash - криптовалюты, майнинг, программирование

Выполнение Java в Ubuntu: PHP exec() не работает, а консоль работает нормально

Моему веб-сайту нужен PHP для запуска программы Java в фоновом режиме. Итак, PHP выдает метод exec(), чтобы позволить Java сделать всю работу. Реализация отлично работает в Windows, но полностью провалилась в Ubuntu. Хотя exec() не работает, автономный тест с консолью работает нормально.

Я установил test.php, чтобы сузить проблему:

<?php
$output = exec("java -cp ~/path/to/java/class/file/folder Hello 2>&1");
//$output = exec("whoami");
echo $output;
?>


Hello.java это просто:

public class Hello {
   public static void main(String[] args) {
      System.out.println("Hello, world!");
   }
}


Запустив test.php на локальном хосте, он показывает:

Error: Could not find or load main class Hello


Я попытался сузить причину ошибки, и моя мысль была такой:

  1. exec() сама по себе проблематична:

    маловероятно, так как whoami выводит apache-user, как и ожидалось.

  2. что означает сообщение об ошибке:

    Я искал информацию об этой ошибке. Сообщение вроде этого говорит о том, что это вызвано < strong>отсутствие пути к классам. Это не относится ко мне, потому что в консоли это работает. Значит, сообщение об ошибке ничего не значит (не так ли?)

  3. разрешение пользователя/группы:

    Возможно ли, что пользователю apache не разрешено запускать файл класса?
    Я проверил и обнаружил, что код разрешения Hello.class равен rw-r--r--, владельцем которого является apache-user:webmasters.
    Но даже если ни у кого нет прав доступа x к файлу, я все равно могу запустить его в консоли (под своим собственным пользователем).
    Я не уверен в ситуации здесь. Но я так понимаю, что при запуске java-программы на самом деле она JVM выполняется (или что-то еще); поэтому разрешение Hello.class не имеет значения.


    Я нашел еще один сообщение похожая ситуация. Но его решение - указание полного пути к Java bin /usr/bin/java - у меня не работает...


Что вызывает ошибку?

Кто-нибудь может помочь? Подробное решение приветствуется! Я новичок @_@

Большое спасибо!!!


  • Доступен ли файл path/to/java для пользователя apache? 16.12.2012
  • Да, apache-user является владельцем и файла, и подкаталога, и в группе к базовому каталогу проекта, у которого есть r доступ как минимум. 16.12.2012
  • подождите... `ls /path/to/java/class/foldr 2›&1' доступ запрещен. Позвольте мне попробовать еще раз... Плохо! 16.12.2012

Ответы:


1

Вы пробовали java -cp /path/to/folder/containing/class/file Hello 2>&1? Похоже, что сам файл класса не должен быть путем к классам. Он должен быть в пути к классам. С другой стороны, если бы это был файл .jar, вы бы указали имя файла в пути к классам.

16.12.2012
  • Привет Сумья! Виноват. В реальном имени пути это каталог, а не сам файл класса. Я отредактировал свой вопрос, чтобы отразить это. Извините за путаницу! 16.12.2012

  • 2

    Я решил проблему... Довольно неожиданно.

    Я изменил путь к классам.

    Ранее это было что-то вроде ~/myproject/to/java/class/file/folder. И я изменил его на /home/myuser/myproject/to/java/class/file/folder.

    Но я совершенно не понимаю, почему нотация ~ не работает с exec().

    16.12.2012
  • ~ Относится к домашнему каталогу текущего пользователя. Итак, при запуске скрипта под apache текущим пользователем в вашем случае является apache-user. Поэтому, когда вы выполняете php exec() с помощью символа ~, скорее всего, он будет указывать на /home/apache-user/. Которого из вашего собственного ответа нет, где находится скрипт. 16.12.2012
  • ~ не работает, потому что это заполнитель для домашнего каталога текущего пользователя. Одна из трех вещей неверна: домашний каталог пользователя apache не тот, который вам нужен. 2: вы работаете в безопасном режиме, и ~ экранируется (не уверен, экранирует ли PHP тильды, но может быть) или вы полагаетесь на загрузку данного файла .profile, что exec тоже не делает (вероятно, здесь не имеет значения) 16.12.2012
  • Хорошо, я понимаю. Спасибо, парни! 17.12.2012

  • 3

    Дайте путь и файл Hello.java бесплатно.

    Проверьте права для пользователя apache с помощью:

    sudo -u webmasters java -cp /path/to/java/class/file/folder Hello
    
    chmod a+r Hello.class
    
    16.12.2012
  • Привет Юп! Когда я запускаю первую строку, она говорит sudo: echo.php: команда не найдена. Кроме того, что такое echo.php? 16.12.2012
  • ошибся; должна была быть джава... 16.12.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..