2010-08-18 6 views
6

xinetd에서 서버가 작동하는 데 필요한 변경 사항을 아는 사람은 누구입니까?리눅스 : xinetd에서 데몬/서비스를 사용하는 방법?

서버는 Linux에서 실행되는 .NET 메일 서버입니다.

은 참조를 위해이 게시물의 하단을 참조하십시오 Lumisoft Mailserver Forum Post

참고 : xinetd가 아닌 모노 서비스를. [x] inetd는 인터넷 슈퍼 서버입니다.
슈퍼 서버는 요청시 서버 서비스를 시작합니다.
(서버 서비스가 지속적으로 실행되는 것과는 반대로, 어떤 것이 모노 서비스입니까?)

답변

8

inetd 서비스는 독립 실행 형 서버와 다르게 실행됩니다. inetd 서비스는 stdout을 읽고 stdout에 써서 inetd가 자신의 소켓을 추적하는 대신 TCP/IP의 세부적인 내용을 처리하도록합니다. inetd에서 서버를 실행하려면 동일한 작업을 수행해야합니다.

다음 프로그램은 내 컴퓨터에 xinetd를 아래에서 잘 실행 : 내가 소켓에 대해 전혀 걱정하지 않아요

#include <iostream> 
#include <string> 

using namespace std; // yeah, i'm lazy. 

int main() 
{ 
    string name; 
    cout << "What's your name? " << flush; 
    cin >> name; 
    cout << "Hi, " << name << "!" << endl; 
} 

주 - 서비스가 표준 입력을 읽고 표준에 쓸 수 있도록 xinetd가이 일을 주선 산출. 대부분의 경우 콘솔에서 실행하는 것처럼 앱을 작성하면됩니다. 소켓 세부 정보는 서비스의 구성 파일에 지정됩니다. (실제 소켓이 될 수있는 stdin/stdout을 사용하여 소켓에 대한 세부 정보를 가져 오거나 설정할 수는 있지만 확실하지는 않습니다.하지만 실제로는 inetd에 남겨 두어야합니다.)

+0

샘플이 있습니까, C++ 또는 C입니까? –

+0

@Quandary : updated. – cHao

+0

감사합니다. 실제로 매우 간단하게 보입니다.정말 그게 더 많지 않아? 따라서 클라이언트가 무엇이든 포트에 연결하면 "이름이 무엇입니까?"라는 메시지가 수신되고 이름이 전송되며 다시 ""이됩니다. 그리고 시간 초과가 xinetd에 의해 처리된다고 가정합니다. 정말로 우스운 이야기. xinetd 프로그래밍을 살펴 봐야한다고 생각합니다. 서버를 단일 클라이언트 콘솔 프로그램처럼 단순하게 만듭니다. –

1

inetd 서비스는 데이터를 가져 와서 사용자와의 어느 정도의 상호 작용을 필요로하는 앱에서 정말 유용합니다. IT는 소켓을 (x) inetd에서 std (in, out, err)로 파이핑하여 tcp/udp를 처리합니다. inetd 응용 프로그램은 시스템 정책 파일과 ACL을 통해 tcpwrappers와 함께 보안을 강화합니다.

그래서 콘솔 앱과 같이 앱을 작성합니다. 실제로는 콘솔 앱이므로 작성하십시오. inetd는 네트워크에서 앱 입력에 이르는 투명 역방향 프록시라고 생각하면됩니다.

조언이 있으시면 프로세스 신호를 올바르게 처리 할 코드를 작성하고 시스템의 다른 프로세스와 상호 작용해야 할 경우 unix socket/fifo를 사용하십시오.

또한 많은 양의 데이터를 한 번에 스트리밍하거나 많은 연결이 필요한 앱을 작성하지 마세요. 확장 성은 inetd가 병목이되는 문제이므로 Apache와 Sendmail이 inetd에 대한 지원을 중단하고 대신 모노 응용 프로그램으로 자리 매김하는 이유입니다. HTTP는이 역할에 더 잘 부합하며 nginx로 fastcgi (또는 선호하는 프레임 워크 삽입) 스크립트는 해당 사용 사례에 가장 잘 작동합니다.

inetd를위한 좋은 예는 다음과 같습니다

lock = Mutex.new 

trap :HUP { #log the connection and cleanup } 
trap :USR1 { lock.synchronize do #stuff; end } 
trap :TERM { #clean up } 
trap :KILL { #clean up and die with error codes } 

puts "App name - version" 

loop do 
    ('%s> ' % Console.prompt).display 
    input = gets.chomp 
    command, *params = input.split /\s/ 
    case command 
    when /\Ahelp\z/i 
     puts App.help_text 
    when /\Ado\z/i 
     Action.perform *params 
    when /\Aquit\z/i 
     exit 
    else 
     puts 'Invalid command' 
    end 
end 
exit 

을 편집 /etc/services이 같은 응용 프로그램을 포함합니다 : myapp와 포트 번호/프로토

/etc/inetd.conf (또는 xinetd가에 응용 프로그램을 추가 할 수 있습니다. d)는 다음과 같습니다 : myapp stream tcp6 nowait myappuser/path/to myapp myapp -arg_flags

관련 문제