最近在阿里云搞了一个云服务器 选用的是windows server 2003系统。
因为平时有在照顾我的QQ农场,所以我在服务器上开一个个QQ外挂。但是,问题来了,长时间开挂的话腾讯有验证码,超过10分钟不输入外挂就自动关闭了。所以我就想搞一个程序挂在服务器上监听我的农场外挂,如果外挂自动退出了,我就给自己发一封邮件。
想来想去我决定用Runtime来实现这个功能。
思路如下
1、每隔1分钟检查一次进程
2、如果QQ农场的进程被关闭了就发送邮件,然后结束程序。
package com.nongchang;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.Properties;
import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
public class Main {
public static void main(String[] args) throws IOException, InterruptedException, MessagingException {
while (true) {
Process p = Runtime.getRuntime().exec("tasklist /FI \"PID eq " + args[0] + "\"");
InputStream fis = p.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
if (br.readLine() == null) {
//进程没了发邮件提醒
Main a = new Main();
a.Email();
System.exit(0);
}
Thread.sleep(60 * 1000);
}
}
public void Email() throws UnsupportedEncodingException, MessagingException {
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.qq.com");
props.put("mail.smtp.auth", "true");
PopupAuthenticator auth = new PopupAuthenticator();
Session session = Session.getInstance(props, auth);
session.setDebug(true);
MimeMessage message = new MimeMessage(session);
Address addressFrom = new InternetAddress(
PopupAuthenticator.mailuser, "啊啊");//
Address addressTo = new InternetAddress("123456@qq.com", "LUO");//发送给谁
message.setSubject("QQ农场外挂已经关闭");//题目
message.setText("QQ农场外挂已经关闭");//邮件内容
message.setFrom(addressFrom);
message.addRecipient(Message.RecipientType.TO, addressTo);
message.saveChanges();
Transport transport = session.getTransport("smtp");
transport.connect("smtp.qq.com", PopupAuthenticator.mailuser,
PopupAuthenticator.password);
transport.send(message);
transport.close();
System.out.println("sent suc");
}
class PopupAuthenticator extends Authenticator {
public static final String mailuser = "10000@qq.com";//需要登录自己的邮箱
public static final String password = "123456";//自己邮箱密码
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(mailuser, password);
}
}
}
因为这个程序我是导出成jar格式 执行的时候需要用输入PID 所以用了arg[0]这种方式。
该代码关键在于
Process p = Runtime.getRuntime().exec("tasklist /FI \"PID eq " + args[0] + "\"");
tasklist /FI "PID eq 123"
意思是列出PID等于123的进程信息
在cmd提示中输入tasklist /? 能查看到命令下的所有选项