Ubuntu 시스템에서는 실행되지만 Unix 웹 서버에서는 실행되지 않는 Linux 프로그램

Ubuntu 시스템에서는 실행되지만 Unix 웹 서버에서는 실행되지 않는 Linux 프로그램

저는 Windows뿐만 아니라 Linux에서도 사용할 수 있는 명령줄 프로그램 "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이기 때문이죠?

관련 정보