首先,我要感謝你們不提供解決方案作爲解決方案(儘管瞭解其他方法可以很酷)。我正在爲check_mk alert插件使用tg-master項目(cli的電報)。我發現電報是在一個stdin/stdout進程上運行的,所以我認爲將它「粘合」起來會很酷,所以我用很多來自博客的構建塊編寫了代碼,並編寫了接下來的兩段代碼。他們已經工作(我有時需要處理破損的管道),但我想知道是否可以從一些專家的新想法分享。更好的方式來處理perl套接字來讀/寫活動進程
正如你所看到的,我的代碼依賴於從衍生過程中讀取死亡的eval,我知道不是最好的方法。有什麼建議麼? :d
謝謝你們
服務器
use strict;
use IO::Socket::INET;
use IPC::Open2;
use POSIX;
our $pid;
use sigtrap qw/handler signal_handler normal-signals/;
sub signal_handler {
print "what a signal $!\nlets kill $pid\n";
kill 'SIGKILL', $pid;
#die "Caught a signal $!";
}
# auto-flush on socket
$| = 1;
# creating a listening socket
my $socket = new IO::Socket::INET(
LocalHost => '0.0.0.0',
LocalPort => '7777',
Proto => 'tcp',
Listen => 5,
Reuse => 1
);
die "cannot create socket $!\n" unless $socket;
print "server waiting for client connection on port 7777\n";
my ($read_proc, $write_proc);
my ($uid, $gid) = (getpwnam "nagios")[ 2, 3 ];
POSIX::setgid($gid); # GID must be set before UID!
POSIX::setuid($uid);
$pid = open2($read_proc, $write_proc, '/usr/bin/telegram');
#flush first messages;
eval {
local $SIG{ALRM} = sub { die "Timeout" }; # alarm handler
alarm(1);
while (<$read_proc>) { }
};
while (1) {
my $client_socket = $socket->accept();
my $client_address = $client_socket->peerhost();
my $client_port = $client_socket->peerport();
print "connection from $client_address:$client_port\n";
# read until \n
my $data = "";
$data = $client_socket->getline();
# write to spawned process stdin the line we got on $data
print $write_proc $data;
$data = "";
eval {
local $SIG{ALRM} = sub { die "Timeout" }; # alarm handler
alarm(1);
while (<$read_proc>) {
$client_socket->send($_);
}
};
# notify client that response has been sent
shutdown($client_socket, 1);
}
$socket->close();
客戶
echo "contact_list" | nc localhost 7777
或
echo "msg user#12345 NAGIOS ALERT ... etc" | nc localhost 7777
或
一些其他的Perl腳本=)
此代碼導致瘋狂的進程,並且不允許客戶端退出。 這個想法是在處理許多客戶端連接,發送命令,接收響應和斷開連接時保持本地守護進程「活着」。 ./socket-play.pl 等待連接... 遠程客戶端連接從遠程客戶端讀取 :從遠程客戶端讀取KABOOM :從遠程客戶端讀取:從遠程客戶端讀取:從遠程客戶端讀取:從讀遠程客戶端:從遠程客戶端讀取:從遠程客戶端讀取:從遠程客戶端讀取:從遠程客戶端讀取:從遠程客戶端讀取:從遠程客戶端讀取: – FarDarkMist 2014-09-22 03:06:13