#!/usr/bin/perl -w
use strict;
use warnings;
use DBI; ####
# 这里进行服务器任务管理
##
#字符串映射函数
our %actions = (
"check" => \&pcheck,
"run" => \&prun,
"run_nohup" => \&run_nohup,
"kill" => \&pkill
);
our $home = "/var/www/html";
our $public_home = "/var/www/html/public" ;
our $log_home = "/var/www/html/yfcloud_admin/Public/log" ; our $host = "XXX" ;
our $database = "XXX" ;
our $db_user = "XXX";
our $db_pass = "XXX"; #程序路径
our $ppath = "" ;
#程序名
our $pname = "" ;
#日志文件
our $log_file = "log" ; #检测进程状态,返回PID
# 如果同进程不在运行,则返回空
sub pcheck
{
# grep 排除perl本身的进程
my $cmd = "ps -ef | grep " . $pname . " | grep -v grep | grep -v perl | awk '{print \$2}'";
my $ret = `$cmd` ;
chomp $ret;
#如果有多个进程PID,则返回第一个pid
if( $ret =~ /\n/ ){
$ret = ( split /\n/, $ret )[] ;
}
($ret eq "") ? print : print $ret ;
} #结束进程,返回成功与否
# 0 表示成功
sub pkill
{
my $cmd = "killall $pname";
my $ret = `$cmd`;
print $? ;
} # 参数需要是 程序的全路径
# 启动进程并后台运行,并返回PID
# 启动进程后,需要将进程的PID及日志文件写入数据库
# shell输出格式如下: [1] 15758
sub prun
{
my $cmd = "$pname";
run_exec($cmd);
} # 后台以nuhup方式运行
sub run_nohup
{
my $cmd = "nohup $pname" ;
run_exec($cmd);
} # 命令格式如下: perl ProcessManager.pl $pname $action
sub main
{
umask();
#print "begin\n";
#这里接收参数并执行相应的操作
if( @ARGV < )
{
print "arguments error!\nusage:perl ProcessManager.pl command action\n";
exit ;
}
$pname = $ARGV[] ; #这里使用全局变量算了 ~_~
my $action = $ARGV[] ;
#判断操作是否合法
if( $actions{$action} ){
$actions{$action}->() ;
}else{
print "undeclare action!check you action!\n";
exit ;
}
} main(); ############
##这里是一些工具函数
############
sub gettime
{
my($sec,$min,$hour,$day,$mon,$year) = (localtime(time));
$mon += ;
$day = ($day < )?"0$day":$day;
$mon = ($mon < )?"0$mon":$mon;
$min = ($min < )?"0$min":$min; return "$mon$day$hour$min" ;
} sub run_exec
{
my $cmd = shift ;
#先检测文件是否存在,可执行
if( -x $pname ){
$pname =~ m#.+/(.+)# ; #获得程序名(包括后缀名)作为日志文件名称
# 建立程序的日志文件目录
my $name = $ ;
mkdir "$log_home/$name" or die("cannot create dir:$name") unless ( -e "$log_home/$name" );
$log_file = "$log_home/$name/".gettime() ;
# print "log_file : $log_file\n";
$cmd .= " > $log_file 2>&1 &";
addToDB($name,$log_file);
my $pid = fork;
if (not $pid) {
$pid = $$;
print $pid ;
exec($cmd); #exec是异步的,执行完后就脱离perl程序了
}
}else{
print "$pname cannot be excuted\n";
exit ;
}
} # 将日志写入日志
sub addToDB
{
my ($progName,$log_file) = @_ ;
my $createtime = time ;
my $db_handle = DBI->connect("DBI:mysql:database=$database;host=$host", $db_user, $db_pass, {'RaiseError' => })|| die "Could not connect to database: $DBI::errstr"; my $sql = "insert into log (name,log_file,createtime) values (?,?,?)";
my $sth = $db_handle->prepare($sql); $sth->execute($progName, $log_file , $createtime) or die $DBI::errstr;
$sth->finish(); $db_handle->disconnect();
}

perl进程管理一例的更多相关文章

  1. 27-Perl 进程管理

    1.Perl 进程管理Perl 中你可以以不同的方法来创建进程.本教程将讨论一些进程的管理方法. 你可以使用特殊变量 $$ 或 $PROCESS_ID 来获取进程 ID. %ENV 哈希存放了父进程, ...

  2. perl学习之进程管理

    系统函数 == 最简单的系统调用  system "date"; # Perl会将 date 命令传递给unix的shell并获取返回值和error信息等   == 带有系统参数的 ...

  3. Android内存进程管理机制

    参考文章: http://www.apkbus.com/android-104940-1-1.htmlhttp://blog.sina.com.cn/s/blog_3e3fcadd0100yjo2.h ...

  4. Linux进程管理知识整理

    Linux进程管理知识整理 1.进程有哪些状态?什么是进程的可中断等待状态?进程退出后为什么要等待调度器删除其task_struct结构?进程的退出状态有哪些? TASK_RUNNING(可运行状态) ...

  5. 初探Linux进程管理机制

    转至:http://ixdba.blog.51cto.com/2895551/543737 一 .进程的概念和分类1.进程的概念 Linux是一个多用户多任务的操作系统.多用户是指多个用户可以在同一时 ...

  6. UNIX环境高级编程——进程管理和通信(总结)

    进程管理与通信 进程的管理 进程和程序的区别: 进程: 程序的一次执行过程   动态过程,进程的状态属性会发生变化 程序:存放在磁盘上的指令.数据的有序集合  是个文件,可直观看到 程序program ...

  7. Linux进程管理详解

    何谓进程?进程,就是正在执行的一个程序或命令,每一个进程都是一个运行实体,有自己的地址空间,并占用一定的系统资源.简而言之,进程就是运行中的程序.在Linux中,诸如ls等命令都是进程,只不过某些命令 ...

  8. linux进程管理和系统状态查看命令简介

    1 进程管理简介 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础 2 常用命令 2.1 pstree 2.1.1 功能描 ...

  9. Linux性能及调优指南(翻译)之Linux进程管理

    本文为IBM RedBook的Linux Performanceand Tuning Guidelines的1.1节的翻译原文地址:http://www.redbooks.ibm.com/redpap ...

随机推荐

  1. Android7.0新特性,及Android N适配

    新特性部分 Android 7.0 Nougat 提供新功能以提升性能.生产效率和安全性,主要新增了下面的新特性和优化: 一.新的Notification Android N 添加了很多新的notif ...

  2. robot framework + python实现http接口自动化测试框架

    https://www.jianshu.com/p/6d1e8cb90e7d 前言 下周即将展开一个http接口测试的需求,刚刚完成的java类接口测试工作中,由于之前犯懒,没有提前搭建好自动化回归测 ...

  3. fortune 计算公式

    fortune 计算PV值. 举例:一笔 120.00的债权; 12天还完,3.15号借款,3.16开始还款.等额本息还款计算出每天还款: 10.22 根据 现值计算公式 PV = CFn/(1+r) ...

  4. LintCode: Number of Islands

    分析:经典连通分量问题 图: 节点:所有1的位置 边:两个相邻的1的位置有一条边 BFS/DFS (DFS使用递归,代码较短) 选一个没标记的点,然后搜索,扩展4个邻居(如果有),直到不能扩展 每一次 ...

  5. ZH奶酪:哈工大LTP云平台标记含义及性能

    从官网搬过来的 囧rz 哈工大讯飞语言云 由哈工大 和科大讯飞 联合研发的中文自然语言处理云服务平台.结合了哈工大“语言技术平台——LTP” 高效.精准的自然语言处理核心技术和讯飞公司在全国性大规模云 ...

  6. JAVA设计模式——第 8 章 适配器模式【Adapter Pattern】(转)

    好,请安静,后排聊天的同学别吵醒前排睡觉的同学了,大家要相互理解嘛.今天讲适配器模式,这个模式也很简单,你笔记本上的那个拖在外面的黑盒子就是个适配器,一般你在中国能用,在日本也能用,虽然两个国家的的电 ...

  7. bootstrap找不到glyphicons-halflings-regular.woff2

    在vue2的项目中是用bootstrap,提示下面的字体文件找不到 http://localhost:8080/static/fonts/glyphicons-halflings-regular.wo ...

  8. poj 1664 放苹果(递推)

    题目链接:http://poj.org/problem? id=1664 放苹果 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions ...

  9. Android StageFrightMediaScanner源码解析

    1. 简单介绍 Android中在StageFrightMediaScanner实现对多媒体文件的处理. 此外在StageFrightMediaScanner定义了支持的多媒体文件类型. 文件位置 f ...

  10. Web Storage与Cookie相比存在的优势:

    (1).存储空间更大:IE8下每个独立的存储空间为10M,其他浏览器实现略有不同,但都比Cookie要大很多. (2).存储内容不会发送到服务器:当设置了Cookie后,Cookie的内容会随着请求一 ...