perl进程管理一例
#!/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进程管理一例的更多相关文章
- 27-Perl 进程管理
1.Perl 进程管理Perl 中你可以以不同的方法来创建进程.本教程将讨论一些进程的管理方法. 你可以使用特殊变量 $$ 或 $PROCESS_ID 来获取进程 ID. %ENV 哈希存放了父进程, ...
- perl学习之进程管理
系统函数 == 最简单的系统调用 system "date"; # Perl会将 date 命令传递给unix的shell并获取返回值和error信息等 == 带有系统参数的 ...
- Android内存进程管理机制
参考文章: http://www.apkbus.com/android-104940-1-1.htmlhttp://blog.sina.com.cn/s/blog_3e3fcadd0100yjo2.h ...
- Linux进程管理知识整理
Linux进程管理知识整理 1.进程有哪些状态?什么是进程的可中断等待状态?进程退出后为什么要等待调度器删除其task_struct结构?进程的退出状态有哪些? TASK_RUNNING(可运行状态) ...
- 初探Linux进程管理机制
转至:http://ixdba.blog.51cto.com/2895551/543737 一 .进程的概念和分类1.进程的概念 Linux是一个多用户多任务的操作系统.多用户是指多个用户可以在同一时 ...
- UNIX环境高级编程——进程管理和通信(总结)
进程管理与通信 进程的管理 进程和程序的区别: 进程: 程序的一次执行过程 动态过程,进程的状态属性会发生变化 程序:存放在磁盘上的指令.数据的有序集合 是个文件,可直观看到 程序program ...
- Linux进程管理详解
何谓进程?进程,就是正在执行的一个程序或命令,每一个进程都是一个运行实体,有自己的地址空间,并占用一定的系统资源.简而言之,进程就是运行中的程序.在Linux中,诸如ls等命令都是进程,只不过某些命令 ...
- linux进程管理和系统状态查看命令简介
1 进程管理简介 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础 2 常用命令 2.1 pstree 2.1.1 功能描 ...
- Linux性能及调优指南(翻译)之Linux进程管理
本文为IBM RedBook的Linux Performanceand Tuning Guidelines的1.1节的翻译原文地址:http://www.redbooks.ibm.com/redpap ...
随机推荐
- jstl函数的使用
1.fn:contains()和fn:containsIgnoreCase() fn:contains()函数用于确定一个字符串是否包含指定的子串. fn:containsIgnoreCase()函数 ...
- 014-Go Web 对pg增删改查测试
1:data/data.go package data import( "fmt" "database/sql" _"github.com/lib/p ...
- Javascript中怎样获取统一管理的Java提示语
项目开发中,各个页面.各个业务操作都会使用提示语.面对这么多message,更好的方式是统一管理这些消息. 这样在做国际化的时候进行统一处理也变的方便. 推荐方案使用数据库来管理全部提示语,在项目启动 ...
- HDU 3001 Travelling (三进制状态压缩 DP)
题意:有 n 个city,能够选择任一城市作为起点,每一个城市不能訪问超过2次, 城市之间有权值,问訪问所有n个城市须要的最小权值. 思路:由于每一个城市能够訪问最多两次,所以用三进制表示訪问的状态. ...
- python获取PING结果
# -*- coding: utf-8 -*- import subprocess import re def get_ping_result(ip_address): p = subprocess. ...
- SpringMVC对日期类型的转换@ResponseBody返回的DateTime是long类型
目前,多数web开发这都在使用Spring的框架.但是这个框架有个 @ResponseBody 注解返回json时,日期格式默认显示为时间戳. 而我们页面展示的时候一般都是以下格式: yyyy-MM- ...
- DLib压缩解压程序示例
/* 这是一个示例程序,使用了Dlib库的compress_stream和cmd_line_parser组件. 这个示例实现了一个简单实用的命令行压缩程序. 当使用-h选项时候,程序输出如下: 使用: ...
- Dubbo架构设计详解(转收藏)
转自:http://shiyanjun.cn/archives/325.html Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合 ...
- ios 7新特性
1:解决ios7.0中视图控制器中视图坐标布局问题 if ([[[UIDevice currentDevice] systemVersion] floatValue]>=7.0) { self. ...
- [转]HTML DIV+CSS 命名规范大全
原文链接 常用DIV+CSS命名大全集合,即CSS命名规则 我们开发CSS+DIV网页(Xhtml)时候,比较困惑和纠结的事就是CSS命名,特别是新手不知道什么地方该如何命名,怎样命名才是好的方法. ...