使用linux deploy App可以将Android设备(手机,平板等)改造成linux服务器,基本上可以实现服务器的各种功能,但是对于指令开关机,定时任务等无能为力,会提示“Running in chroot, ignoring request.”
开关机指令无所谓,可以直接在手机上操作以实现,但定时任务没有办法,而且对于动态IP地址,地址变动以后若不及时更新dns解析,会失去远程访问能力。
这里我的解决思路是通过部署一个spring boot的jar包并且长期运行,在里面通过@Scheduled,设置定时指令,以代替服务器的crontab功能 (具体实现细节在文末链接)
因为旧手机改造成的服务器放在家庭宽带下,没有ipv4地址,而且ipv6地址也在变化, 我设置的任务是每隔一个小时向阿里云dns更新一次ipv6地址解析
阿里云dns提供了基于java的api接口,可以直接在springboot中调用接口更新解析
实现动态域名解析DDNS (aliyun.com)https://help.aliyun.com/document_detail/141482.html
新建一个类,设置定时任务,定时自动执行@Scheduled注解下面的函数
/**
* @author Y.zero
* @date 2021/9/16
*/
public class UpdateTask {
@Scheduled(cron = "0 0 0/1 * * ? ")
//定时任务,每隔一小时更新一次
public void updateTest(){
//执行更新程序
//阿里云提供的代码
DDNS.go();
//向服务器中记录日志
Runtime rt = Runtime.getRuntime();
try {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss");
String time =df.format(new Date());
rt.exec("sed -i '1i\\"+time+" 服务器自动更新dns解析' /yzero/logTest/ipv6ddnslog.txt");
} catch (IOException e) {
e.printStackTrace();
}
}
}
也可以通过GET方法在定时任务规定执行时间以外手动执行更新
直接访问该路径就会开始更新
http://ip地址:springboot项目端口号/ddns
比如:http://192.168.1.199:8090/ddns
就会将局域网中ipv4地址为192.168.1.199的设备的ipv6地址更新到指定的域名中
需要更新本机地址则将IP地址改成localhost即可
http://localhost:8090/ddns
@GetMapping("/ddns")
@ResponseBody
//手动实现一次动态域名解析更新
public String goDDNS(){
return DDNS.go();
}
而像腾讯云等不提供Java接口的,可以通过sh脚本来实现(阿里云也有类似的脚本,但是我没有试过)
利用shell脚本,实现腾讯云DNSPod进行DDNS动态域名解析ipv6地址_FlySky的发问时间-优快云博客https://blog.youkuaiyun.com/weixin_43978546/article/details/113222378利用Java中的Runtime包可以调用linux指令,通过指令调用sh脚本实现域名动态解析
/**
* @author Y.zero
* @date 2021/9/16
*/
public class UpdateTask {
@Scheduled(cron = "0 0 0/1 * * ? ")
//定时任务,每隔一小时更新一次
public void updateTest(){
Runtime rt = Runtime.getRuntime();
//将需要执行的指令写成字符串
String command = "bash /yzero/ddns.sh";
try {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss");
String time =df.format(new Date());
//执行指令
rt.exec(command);
//向服务器中添加日志
rt.exec("sed -i '1i\\"+time+" 服务器自动更新dns解析' /yzero/logTest/ipv6ddnslog.txt");
} catch (IOException e) {
e.printStackTrace();
}
}
}
以上就是我通过使用springboot中的Scheduled服务代替服务器定时任务crontab,解决linux deploy无法使用定时任务的问题,实现域名动态解析DDNS的全部思路了
关于基于java的阿里云动态解析服务,在这里