使用perl脚本自动重启程序

时间:2014-10-27 21:16:51

标签: windows perl variables batch-file telnet

我在Windows 2008 r2机器上运行游戏服务器,我试图设置一个自动重启脚本每12小时运行一次,到目前为止我使用Windows任务调度程序每12小时加载一个Perl脚本连接到telnet是为了让玩家知道服务器正在重启,然后当脚本完成时它关闭,我的第二个任务调度程序运行.bat来杀死打开的任务并重新启动它们,我想要做的就是杀死进程然后重新启动只使用perl脚本的相同进程,因此不需要.bat。

所以我一直在谷歌搜索疯狂,空出来,我是非常新的使用Perl所以我根据我想做的事情在谷歌找到的东西都使用PID杀死正在运行的任务。我做了一个测试,打开和关闭一个保存的txt文件,以查看每次打开时进程ID是否发生变化,看起来确实如此。因此,除非有针对此的解决方法,否则使用PID将无效。

这是Telnet连接,如果有人可以帮我清理它,所以没有那么多的打印,也许可以调用变量,而不是让它更简单,它也会有所帮助。

$hostname = "IP_HERE";

use Net::Telnet ();
    $t = new Net::Telnet (Timeout => 60,
                          Prompt => '/bash\$ $/');
    $t->open(Host => $hostname,
               Port => PORT_HERE);
    $t->waitfor('/Please enter password/');            
    $t->print("PASSWORD_HERE");
    $t->print("say \"[FF0000]WARNING! [FF0000]SERVER WILL RESTART IN [FF0000]3 MINUTES[FFFFFF] !!!\" ");
    sleep(60);
    $t->print("say \"[FF0000]WARNING! [FF0000]SERVER WILL RESTART IN [FF0000]2 MINUTES[FFFFFF] !!!\" ");
    sleep(60);
    $t->print("say \"[FF0000]WARNING! [FF0000]SERVER WILL RESTART IN [FF0000]1 MINUTE[FFFFFF] !!!\" ");
    sleep(45);
    $t->print("say \"[FF0000]WARNING! [FF0000]SERVER WILL RESTART IN [FF0000]15 SECONDS[FFFFFF] !!!\" ");
    sleep(15);
    $t->print("say \"[FF0000]WARNING! [FF0000]SERVER WILL RESTART IN [FF0000]5\" ");
    sleep(1);
    $t->print("say \"[FF0000]WARNING! [FF0000]SERVER WILL RESTART IN [FF0000]4\" ");
    sleep(1);
    $t->print("say \"[FF0000]WARNING! [FF0000]SERVER WILL RESTART IN [FF0000]3\" ");
    sleep(1);
    $t->print("say \"[FF0000]WARNING! [FF0000]SERVER WILL RESTART IN [FF0000]2\" ");
    sleep(1);
    $t->print("say \"[FF0000]WARNING! [FF0000]SERVER WILL RESTART IN [FF0000]1\" ");
    sleep(1);
    $t->print("sa");
    sleep(3);
    $t->print("shutdown");
    sleep(3);
exit;

如果有人能让我开始朝着正确的方向前进,那将意味着很多,我已经检查了系统和其他一些事情,但无论我发现它总是显示通过PID而不是进程名称结束进程。并没有任何东西向我展示了根据其所在的目录重新加载程序的正确方法。

2 个答案:

答案 0 :(得分:0)

我遇到的东西看起来很有前景但不确定如何调用两个不同的运行进程。有什么想法吗?

$|++;
system("WMIC /OUTPUT:C:\\log.txt path win32_process get Processid,Commandline");
$infile1="C:/log.txt";
open(IN1,"<:encoding(UTF-16LE)","$infile1");
$profilename="ts3client_win64.exe";
while(<IN1>)
{
            next if (/^(\s)*$/);
            s/(\s)+$//g;
            if (/$profilename/)
            {
            print "$1\n" if (m/(\d+)$/);
            system("taskkill /F /PID $1");
            }
}
close(IN1);

答案 1 :(得分:0)

现在已经工作了好几个小时并且没有得到答案我没有测试下面的代码所以不知道它是否会工作但是我在这里发布它以查看是否有人对此有任何意见并且看起来是否正确在我使用它之前。它的作用是启动一个telnet连接,然后向在线玩家发送一条消息,让他们知道服务器正在重启,然后使用命令“sa”保存服务器信息,然后使用“shutdown”命令关闭服务器。接下来的几个部分是我最困惑的地方。

第二部分应关闭服务器exe,然后管理器exe再开始从目录中删除文件,然后再重新加载管理器和服务器。这就是我到目前为止请留下一些反馈,让我知道它是否正确或是否有更简单的方法来完成所有这些。

$hostname = "SERVER_IP_HERE";
use Net::Telnet ();
    $t = new Net::Telnet (Timeout => 60,
                          Prompt => '/bash\$ $/');
    $t->open(Host => $hostname,
               Port => SERVER_PORT_HERE);
    $t->waitfor('/Please enter password/');            
    $t->print("SERVER_PASSWORD_HERE");
    $t->print("say \"[FF0000]WARNING! [FF0000]SERVER WILL RESTART IN [FF0000]3 MINUTES[FFFFFF] !!!\" ");
    sleep(60);
    $t->print("say \"[FF0000]WARNING! [FF0000]SERVER WILL RESTART IN [FF0000]2 MINUTES[FFFFFF] !!!\" ");
    sleep(60);
    $t->print("say \"[FF0000]WARNING! [FF0000]SERVER WILL RESTART IN [FF0000]1 MINUTE[FFFFFF] !!!\" ");
    sleep(45);
    $t->print("say \"[FF0000]WARNING! [FF0000]SERVER WILL RESTART IN [FF0000]15 SECONDS[FFFFFF] !!!\" ");
    sleep(10);
    $t->print("say \"[FF0000]WARNING! [FF0000]SERVER WILL RESTART IN [FF0000]5\" ");
    sleep(1);
    $t->print("say \"[FF0000]WARNING! [FF0000]SERVER WILL RESTART IN [FF0000]4\" ");
    sleep(1);
    $t->print("say \"[FF0000]WARNING! [FF0000]SERVER WILL RESTART IN [FF0000]3\" ");
    sleep(1);
    $t->print("say \"[FF0000]WARNING! [FF0000]SERVER WILL RESTART IN [FF0000]2\" ");
    sleep(1);
    $t->print("say \"[FF0000]WARNING! [FF0000]SERVER WILL RESTART IN [FF0000]1\" ");
    sleep(1);
    $t->print("sa");
    sleep(2);
    $t->print("shutdown");
    sleep(3);
$|++;
system("WMIC /OUTPUT:C:\\log.txt path win32_process get Processid,Commandline");
$infile1="C:/log.txt";
open(IN1,"<:encoding(UTF-16LE)","$infile1");
$server="SERVERS.exe";
$servermanager="SERVERMANAGERS.EXE";
while(<IN1>)
{
            next if (/^(\s)*$/);
            s/(\s)+$//g;
            if (/$server/)
            {
            print "$1\n" if (m/(\d+)$/);
            system("taskkill /F /PID $1");
            }
            if (/$servermanager/)
            {
            print "$1\n" if (m/(\d+)$/);
            system("taskkill /F /PID $1");
            }
}
close(IN1);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.-1.0.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.0.0.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.0.-5.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.1.-5.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.-4.-9.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.-4.-10.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.-3.-9.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.-3.-10.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.7.-4.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.7.-5.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.14.-14.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.14.-13.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.38.-9.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.39.-9.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.-10.3.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.-9.3.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.-10.2.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.-9.2.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.-21.1.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.-21.0.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.-22.1.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.-22.0.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.17.-2.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.16.-2.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.16.-1.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.10.7.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.9.7.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.8.7.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.10.8.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.9.8.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.8.8.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.-11.10.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.-10.10.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.-11.9.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.-10.9.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.1.17.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.-4.19.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.-3.19.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.12.24.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.11.24.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.12.23.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.-22.18.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.-21.18.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.-22.17.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.-21.17.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.-21.16.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.-17.29.7rg”);
sleep(1);  
unlink (“D:\\FULL\\PATH\\TO\\FILE\\r.-17.28.7rg”);
sleep(1);   
system("c:\\FULL\\PATH\\TO\\PROGRAM\\.EXE"); 
exit;