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 ...
随机推荐
- Springmvc 服务器端文件下载
转自:http://blog.csdn.net/boneix/article/details/51303280 业务场景:点击下载后直接保存而不是打开 解决代码:前端传入url /** * 返回流 * ...
- 使用FractionSlider生成的视差幻灯效果原型
在线演示 本地下载 非常棒的jQuery插件,帮助你创建超酷的视差效果幻灯!
- junit mockito
package com.zendaimoney.util; import static org.mockito.Mockito.*;import static org.junit.Assert.*;i ...
- JavaScript常用设计模式
单例模式:确保类只能被实例化一次. var obj = {} 2.函数返回值 var func = function () {return {}} var obj = func(); 3.构造函数初始 ...
- 【jeecg-mybatis版本】 mybatis+spring mvc 完美整合方案 查询,保存,更新,删除自动生成
Jeecg-Mybatis版本代码生成器演示视频 http://pan.baidu.com/share/link?shareid=243717&uk=2668473880 简要说明 JE ...
- JPA的配置文件
一.引入包 <dependencies> <!-- https://mvnrepository.com/artifact/org.hibernate.javax.persistenc ...
- C#实现U盘检查,并写入文件
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- SHELL字符串使用总结
1.获取字符串的长度,${#str} #设置字符串 $ str="liqiu" #打印字符串 $ echo $str liqiu #继续打印字符串 $ echo ${str} li ...
- Codeforces Round #234 (Div. 2) :A. Inna and Choose Options
A. Inna and Choose Options time limit per test 1 second memory limit per test 256 megabytes input st ...
- Eclipse 写 Python的一些小问题