저는 Linux와 Windows 모두에서 사용할 수 있는 명령줄 프로그램 "Whitaker's Words"를 다운로드했습니다.
라는 메인 프로그램이 있습니다 words
. Ubuntu(11.10) 시스템에서 명령줄을 통해 실행해 보았더니 제대로 작동했습니다.
./words
Linux 웹 서버(Linux 2.6.37-he-xeon-64gb+1 i686)에서 테스트할 때도 잘 작동합니다.
그런 다음 소스 코드를 일부 변경하고 다시 컴파일하기로 결정했습니다. 이를 위해 다음 명령을 사용했습니다(마지막 4개는 지원 프로그램입니다).
gnatmake -O3 words -bargs -static
gnatmake makedict -bargs -static
gnatmake makestem -bargs -static
gnatmake makeefil -bargs -static
gnatmake makeinfl -bargs -static
생성된 프로그램은 터미널에서 올바른 출력을 볼 수 있으므로 Ubuntu 컴퓨터에서 다시 잘 실행됩니다.
shell_exec()
하지만 PHP를 사용 하거나 웹 서버에서 실행하려고 하면 passthru()
전혀 출력이 없습니다! 에 따르면 ldd
이 프로그램은 statically linked
실제로 작동해야 합니다. 그렇죠?
몇 주 동안 테스트하고 디버깅해 봤는데 아무런 이유도 찾을 수 없습니다. 도와주세요?
여기에서 프로그램을 얻을 수 있습니다:다운로드 링크는 filedropper.com에 있습니다.
(내 질문은 단지: 이 프로그램을 내 웹서버에서 어떻게 실행하게 합니까?이기 때문에 이것은 프로그래밍 질문이 아닌 것 같습니다.)
다음 시스템에서 프로그램을 컴파일하고 싶습니다.
리눅스 우분투 3.0.0-12-일반 #20-우분투 x86 GNU/Linux
이것은 Ubuntu의 최신 Wubi(32비트) 버전입니다.
ldd --version
산출ldd (Ubuntu EGLIBC 2.13-20ubuntu5) 2.13
컴파일된 프로그램을 실행하려는 시스템(웹 서버):
리눅스 2.6.37-he-xeon-64gb+1 i686 GNU/Linux
ldd --version
산출ldd (GNU libc) 2.7
노트:
내 Linux 프로그램을 미리 컴파일된 프로그램으로 교체하면 모든 것이 잘 작동하므로 서버측 오류를 제거할 수 있습니다.
업데이트 #1:
Ubuntu 5.10의 VirtualBox에서 프로그램을 실행해 보았지만(Ubuntu 11.10에서는 제대로 작동함) 역시 작동하지 않았습니다. 좋은 소식입니다. 서버의 잘못은 확실히 아닙니다. 우분투 5.10은 방금 이렇게 말했습니다: floating point exception
. 이것이 도움이 됩니까? Ubuntu 11.10에는 예외가 있지만 왜 예외가 없나요?
업데이트 #2:
이제 GNAT 3.4를 사용하여 Ubuntu 5.1로 컴파일되었습니다. 그러나 모든 것이 절망적입니다. 여전히 출력이 없다고 ldd
말하고 statically linked
(이 방법으로 컴파일했기 때문에) strace
동일한 오류 메시지를 표시합니다. 무슨 뜻이에요? 누락된 파일이 있나요? 이것이 작동하지 않는 이유입니까?
execve("./words", ["./words"], [/* 15 vars */]) = 0
brk(0) = 0x811e000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb76f8000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb76f7000
set_thread_area({entry_number:-1 -> 6, base_addr:0xb76f7680, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
+++ killed by SIGSEGV +++
답변1
웹 서버나 다른 프로그램에서 쉘 이스케이프 모드로 작업을 수행하면 환경 설정이 적용되지 않을 가능성이 높습니다. 예를 들어, 등과 같은 변수 PATH
에는 LD_LIBRARY_PATH
기본 설정이 있거나 설정이 전혀 없으므로 셸 이스케이프를 수행할 때 최소한 다음을 수행해야 합니다.
- 전체 경로로 프로그램을 호출합니다: 예:
/usr/local/bin/gnatmake
또는/usr/local/bin/words
- 출력을 가져와서
/usr/bin/env
쉘 이스케이프에서 올바른 설정이 있는지 확인하십시오. 터미널 쉘에서 동일한 설정을 확인하십시오. - 웹 서버에 대한 제어권이 있는 경우 권한 문제를 피하기 위해 UID로 실행하도록 하십시오.
- 프로그램에 필요한 라이브러리 확인(있는 경우)
ldd /usr/local/bin/words
추가 가능성
프로그램을 직접 실행하는 대신 다음 스크립트를 사용하십시오.
#!/bin/sh
. /etc/profile
/usr/bin/env
pwd
./words 2>&1
그리고 출력을 게시합니다. 이를 통해 프로그램이 실행되었는지, 충돌했는지 여부를 알 수 있습니다.
확인해야 할 또 다른 사항은 사용자 www-data
또는 실행 중인 모든 항목이 ./words
필요한 데이터베이스( ./words
있는 경우)에 대한 액세스 권한을 가지고 있는지 여부입니다.
답변2
프로그램 자체를 실행하는 대신 프로그램을 실행하고 해당 환경 및 STDERR 출력을 기록하는 스크립트를 실행해 보십시오.
웹 서버 로그도 확인해야 합니다.
답변3
어... 저는 프로그래밍 초보입니다만... 웹 서버에서 프로그램을 컴파일할 수도 있을까요? 또는 네트워크 서버에서 실행 중인 것과 동일한 구성으로 가상 머신을 생성하여 그곳에서 코드를 컴파일할 수 있습니다.
하나는 x86이고 다른 하나는 i686이기 때문이죠?