Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php linux正则表达式如何匹配cron进程是否正在运行?_Php_Regex_Process_Cron - Fatal编程技术网

php linux正则表达式如何匹配cron进程是否正在运行?

php linux正则表达式如何匹配cron进程是否正在运行?,php,regex,process,cron,Php,Regex,Process,Cron,我想一次只运行一个进程。所以我需要检查一下。我发现有人建议使用exec() 所以我做了测试函数——一个休眠1分钟,另一个测试进程是否正在运行 public function test($a='', $b='') { exec("ps ax | grep 'php -q /var/www/glab/index.php ajax/test2'", $pids); if (count($pids) > 2) { $exists = true; e

我想一次只运行一个进程。所以我需要检查一下。我发现有人建议使用exec()

所以我做了测试函数——一个休眠1分钟,另一个测试进程是否正在运行

public function test($a='', $b='') {
    exec("ps ax | grep 'php -q /var/www/glab/index.php ajax/test2'", $pids);
    if (count($pids) > 2) { 
        $exists = true;
        echo 'exists' . count($pids);

    print_r($pids);

    }
}
我得到的结果是:

exists3Array
(
    [0] => 30680 pts/8    S+     0:00 php -q /var/www/glab/index.php ajax/test2
    [1] => 30684 ?        S      0:00 sh -c ps ax | grep 'php -q /var/www/glab/index.php ajax/test2'
    [2] => 30686 ?        S      0:00 grep php -q /var/www/glab/index.php ajax/test2
)
我没想到会有3个过程,但我认为这是可以的。我是否可以确保我的功能正常工作?当>2时检测是否正在运行,我是否遗漏了什么?例如,如果某个用户将在linux上运行某个程序,那么这可能不再有效了

或者你能建议一些只匹配一个进程的检查,而不使用sh和grep吗?我是说精确的字符串。我一直在努力,但无法使它只匹配我正在搜索的一个

编辑:

谷歌搜索了更多,找到了更多的例子,并进行了调整:

exec ('ps -efa | grep "php -q /var/www/glab/index.php ajax/test2" |grep -v "grep " | awk "{print $10 $NF}"',  $pids);
    print_r($pids);
进程运行时:

Array
(
    [0] => darius    2046 12877  5 09:23 pts/8    00:00:00 php -q /var/www/glab/index.php ajax/test2
)

它现在匹配1个进程。您能检查一下这是否正常,我是否遗漏了什么吗?

如果您想确保脚本在给定时间只运行一次(无并发),那么通常的方法是实现锁定。在文件系统中使用锁:开始脚本
接触文件(比如在/var/lock/…)并在完成时再次移除该锁。其他已启动的实例首先检查这样的锁是否已经存在,如果已经存在则退出。编写一个pid文件,如果它仍然存在并且是当前的,则退出而不重新运行。锁是坏的。我认为这与我在数据库字段中设置的状态相同。问题是-如果脚本崩溃怎么办?它不会释放锁,除非手动解锁,否则永远不会启动@Anigel-您的意思是在文件中写入进程号,并在脚本完成后删除文件?这也有同样的问题。请解释为什么你认为它不好。您可能不理解该概念,或者我们不理解您的要求。就我个人而言,我会说依赖exec是不好的,我的意思是——我运行脚本。并且发生了一些php或数据库错误。这可能很少见,因为系统运行的时间越长,测试的次数就越多,但仍然无法100%保证脚本不会停止。而且它可能还没有达到实现锁定、删除文件或在数据库中设置状态的程度。我不明白为什么exec不好?我已经读到,当我们让用户注入字符串时,这是唯一不好的。