我必须编写一个SNMP模块来监视我写过的某个服务器应用程序.问题是我必须知道这个应用程序是否正在运行,我应该能够随时杀死它.
我知道应用程序正在侦听的端口(读取应用程序配置文件),我可以尝试将此端口绑定到套接字,以便知道我的应用程序或其他应用程序是否(或不是)正在使用它对于我的模块.这是代码:
int
get_server_status()
{
struct sockaddr_in local;
int port,sockfd;
if (parse_config_file(&port,NULL,CONFIG_FILE_PATH) == -1)
return -1; //Error
if ((sockfd = socket ( AF_INET, SOCK_STREAM, 0 )) < 0)
return -1; //Error
local.sin_family = AF_INET;
local.sin_port = htons ( port );
local.sin_addr.s_addr = inet_addr ("127.0.0.1");
if (bind(sockfd, (struct sockaddr *) &local, sizeof (local) ) < 0 ){
if(errno == EADDRINUSE)
return 1; //Port being used
else
return -1; //Error
}else{
close(sockfd);
return 0; //Port not being used
}
}
Run Code Online (Sandbox Code Playgroud)
问题出现在我需要杀死应用程序时,我既不知道它PID也不知道如何获取它.我可以使用netstat -tln <port>但我不知道如何以编程方式进行.有任何想法吗??
就像netstat,你应该阅读/proc/net/tcp.
解释它:
local_address是IP和端口.00000000:0050将是HTTP(端口号是十六进制).st是州.A是TCP_LISTEN.inode为inode编号(此时为小数)./proc/pid/fd/包含每个打开文件描述符的条目.ls -l对于套接字描述符显示它是一个链接socket:[nnnnnn].该数字nnnnnn应与来自的inode编号匹配/proc/net/tcp.这使得找到这个过程非常烦人,但可能.
找到合适的线/proc/net/tcp并不难,然后你就可以得到inode数.
查找该过程需要您扫描所有进程,查找引用此inode编号的进程.我知道没有更好的方法.