С помощью zsh
:
zsh -xl
В bash
:
PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>&2
Это будет имитировать оболочку входа в систему и показать все, что выполняется (кроме областей, где stderr перенаправляется с помощью ] zsh
) вместе с именем файла, который в настоящее время интерпретируется.
Все, что вам нужно сделать, это найти в этом выводе JAVA_HOME
. (вы можете использовать команду script
, чтобы сохранить этот вывод).
Оказывается, проблема заключалась в нескольких вещах, в основном из-за моего модема / маршрутизатора. Я использую Motorola SB6580 , в котором недавно было обновление прошивки, и который не перезагружался в течение 10 дней, из-за чего он работал довольно медленно, что не позволяло мне вносить в него слишком много изменений.
Обновление микропрограммы изменило страницу переадресации портов , чтобы включить здесь раздел с внешним адресом удаленного хоста (по умолчанию 0.0.0.0), здесь нет проблем, но что-то еще они нарушили существующие правила переадресации портов, которые я установил .
Я использовал диапазон перенаправляемых портов, который не работал, и, изменив этот диапазон на 8399 - 8399, он снова начал работать. Перезагрузка не повлияла на это, кроме увеличения скорости модемов, и не изменила протокол с Оба на TCP.
IP Addr|Start Port|End Port|Remote Host Addr|Start Port|End Port|Protocol|Enabled
192.168.0.101|8340| 8399| 0.0.0.0| 8340| 8399| Both|Checked
192.168.0.101|8399| 8399| 0.0.0.0| 8399| 8399| TCP|Checked
Кроме того, при использовании PHP-команды gethostbyname (gethostname ()) в Linux возвращается локальный адрес 127.0.1.1, вторая запись в файле / etc / hosts, которая не будет работать для привязки сокета. $ _SERVER ['REMOTE_ADDR'] также возвращает предупреждение: невозможно найти хост. вручную изменив его на домашний адрес (подсеть?) (У меня 192.168.0.101) или подстановочный знак IPv4 0.0.0.0 , прослушиватель сокета привязывается правильно и принимает внешние соединения.
Мой опыт работы с маршрутизатором и отсутствие опыта работы с Linux заставили меня склониться к неправильному пути устранения неполадок Linux. Заметив, что что-то не работает и в Windows 7, я внес два вышеуказанных изменения, и теперь все работает как надо.
Вам что-то не хватает концептуально и в коде. У вас есть PHP-код, который прослушивает соединения, но вы должны принять соединение перед его использованием.
$ns = socket_accept($this->wsRead[0]);
$some_string = socket_read($ns, 128);
Вызов socket_accept ()
блоков. Он не вернется, пока какая-то клиентская программа не подключится к программе, ожидающей подключения.
Вызов socket_accept ()
возвращает фактический сокет, который вы используете для связи с удаленной программой. Я не думаю, что isset ()
- это действительно то, что вам нужно, вам следует изучить socket_select ()
или что-то в этом роде. Когда вы закончите общение с пультом дистанционного управления, вы вызываете socket_close ($ ns)
, а затем возвращаетесь к вызову socket_accept ($ this-> wsRead [0])
, чтобы дождаться другая удаленная программа для подключения к вашей программе.
Когда ваша PHP-программа завершит обработку соединений, она должна вызвать socket_close ($ this-> wsRead [0])
, чтобы закрыть сокет, который в основном сообщает ядру ОС прекратить прослушивание входящего TCP SYN. пакеты для указанного вами порта.