#!/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. php composer工具高速使用教程,超级简单

    php依赖管理工具.用于处理packages或者libraries.基于单个工程project,在project的vender目录下保存,默认永远不会全局安装. 须要php 5.3.2+,安装资源包时 ...

  2. performSelector 多个参数

    [self performSelector:@selector(callFooWithArray) withObject:[NSArray arrayWithObjects:@"first& ...

  3. mssql 统计

    这篇文章主要为大家按日,星期,月,季度,年统计销售额的sql语句,需要的朋友可以参考下 --按日,统计本月数据 select sum(payable_amount) as 金额,day([paymen ...

  4. vsphere性能

    vNUMA介绍 http://virtualbarker.com/ vSphere VMware Performance With every release of vSphere the overh ...

  5. vs 15 key

    vs 15 Key :HM6NR-QXX7C-DFW2Y-8B82K-WTYJV vs 15 Key :2XNFG-KFHR8-QV3CP-3W6HT-683CH

  6. POSTGRESQL 支持正则表达式

    昨天遇到了一个奇葩的问题,需要在WHERE条件里面添加正则表达式,抱着试试看的态度,查看了一下postgresql,发现确实可以支持正则,例如: select * from user where em ...

  7. 关于Android中50M+的文本入库处理细节

    好久没有写技术文章,明早4点还要爬起来赶飞机,感觉这个坑有必要记录一下,以慰藉一下自己脆弱的灵魂.周一和周二忙了2天的样子才解决这个问题,中间填了不少的坑,反正已经夜深了,慢慢地记录一点. 场景:项目 ...

  8. Java之所有对象的公用方法>10.Always override toString

    providing a good toString implementation makes your class much more pleasant to use. It is recommend ...

  9. mysql可视化工具

    比较mysql manager lite 和phpmyadmin: 1.phpmyadmin有中文界面, 可以快速入门,但友好性远没有SQL Manager Lite强大 2.SQL Manager ...

  10. python之模块py_compile用法(将py文件转换为pyc文件)

    # -*- coding: cp936 -*- #python 27 #xiaodeng #python之模块py_compile用法(将py文件转换为pyc文件):二进制文件,是由py文件经过编译后 ...