就是检查一下某个进程是否在运行?在linux上你用
ps -ef|grep 你那个进程的路径名|wc -l
这样得到了 到底有几个,如果小于2,你让他在运行一下
把ps -ef|grep 你那个进程的路径名|wc -l
这些,还有些判断,写到一个文件里去
你可以用php写,这样用ps就是系统命令调用拉,象
exec('ps -ef|grep 你那个进程的路径名|wc -l',$a,$b);
?>
$a/$b是返回值吧,你测试一下
然后这个文件永远不能执行完,类似这样
while(true){
exec('ps -ef|grep 你那个进程的路径名|wc -l',$a,$b);
//其他代码
sleep(20)//每20秒检查一下
}
?>
你也可以用perl,那文件最前面加上
#!/usr/bin/perl
如果php,最前面加上以下,就是命令行的php路径
#!/usr/local/php/bin/php -q
//然后php代码
while(true){
exec('ps -ef|grep 你那个进程的路径名|wc -l',$a,$b);
//其他代码
sleep(20)//每20秒检查一下
}
?>
最后你让这个文件后台运行
nohup 这个文件路径 &
最好不要在php开执行shell的函数...
可以通过register_shutdown_function注册一个函数
当php结束,或碰到致命错误停止时,就会执行注册的函数
getmypid()获得进程ID
统计进程数
function countProcesses($scriptName)
{
$first = substr($scriptName, 0, 1);
$rest = substr($scriptName, 1);
$name = '"['.$first.']'.$rest.'"';
$cmd = "ps aux | grep $name | wc -l";
$result = exec($cmd);
return $result;
}
All of the examples above require you to have shell command execution turned on- this example uses only PHP functions and should work on any system (posix is included by default)-
the key is posix_getsid which will return FALSE if the processes does not exist.
$lockfile = sys_get_temp_dir() . '/myScript.lock';
$pid = file_get_contents($lockfile);
if (posix_getsid($pid) === false) {
print "process has died! restarting...\n";
file_put_contents($lockfile, getmypid()); } else {
print "PID is still alive! can not run twice!\n";
exit;
}
?>
:-) perfect if you need to make sure a cron job or shell script has ended before it can be started again.
This works across users- if the cron job is started as 'root' your 'web user' can see if the process is still alive (useful for system status pages)
PHP利用文件锁实现互斥的单进程运行。对某些人可能会有帮助。
比如有些发布程序或蜘蛛程序你设定每小时运行一次,结果程序执行了1小时没执行完。
下面的代码就是解决这类问题的。
1 php
2 //我们需要创建一个临时的互斥锁文件,注意,如果这个文件名跟你正在用的某些文件冲突,请自行改名!
3 $lock_file = $_SERVER['PHP_SELF'].'.single.lock';
4 //打开文件指针并加非阻塞的互斥锁!因为用了LOCK_NB这种非阻塞的模式,不能取得锁就立即返回,而不会傻傻的等着。
5 if(!flock($fp=fopen($lock_file,'w'), LOCK_NB | LOCK_EX))
6 {
7 //无法取得锁就退出
8 die('cannot get lock,already running?');
9 }
10 //成功的获取了锁,就往下干该干的事情。
11 //这里注册一个shutdown_function,目的是程序结束的时候自动删掉那个互斥锁文件,避免留下垃圾。
12 register_shutdown_function('unlink', $lock_file);
不是靠文件名,而是靠flock加的那个互斥的写锁。。。
只要程序结束了,不管是正常退出还是错误退出还是被杀掉,那个锁都自然释放了。
保证单进程运行
/**
* 保证单进程
*
* @param string $processName 进程名
* @param string $pidFile 进程文件路径
* @return boolean 是否继续执行当前进程
*/
function singleProcess($processName, $pidFile)
{
if (file_exists($pidFile) && $fp = @fopen($pidFile,"rb"))
{
flock($fp, LOCK_SH);
$last_pid = fread($fp, filesize($pidFile));
fclose($fp);
if (!empty($last_pid))
{
$command = exec("/bin/ps -p $last_pid -o command=");
if ($command == $processName)
{
return false;
}
}
}
$cur_pid = posix_getpid();
if ($fp = @fopen($pidFile, "wb"))
{
fputs($fp, $cur_pid);
ftruncate($fp, strlen($cur_pid));
fclose($fp);
return true;
}
else
{
return false;
}
}
/**
* 获取当前进程对应的Command
*
* @return string 命令及其参数
*/
function getCurrentCommand()
{
$pid = posix_getpid();
$command = exec("/bin/ps -p $pid -o command=");
return $command;
}
if (singleProcess(getCurrentCommand(), 'path/to/script.pid'))
{
// code goes here
}
else
{
exit("Sorry, this script file has already been running ...\n");
}