在任何给定时间运行 5 个脚本

Posted

技术标签:

【中文标题】在任何给定时间运行 5 个脚本【英文标题】:Have 5 scripts running at any given time 【发布时间】:2013-07-08 01:41:48 【问题描述】:

我有一个启动 90 个不同 php 脚本的 bash 脚本(在 CentOS 6.4 下运行),即。

#!/bin/bash

php path1/some_job_1.php&
php path2/some_job_2.php&
php path3/some_job_3.php&
php path4/some_job_4.php&
php path5/some_job_5.php

php path6/some_job_6.php&
php path7/some_job_7.php&
php path8/some_job_8.php&
php path9/some_job_9.php&
php path10/some_job_10.php
...

exit 0

为了避免我的服务器过载,我使用 & 符号 &,它可以工作,但我的目标是始终同时运行 5 个脚本

有没有办法做到这一点?

【问题讨论】:

linux batch jobs in parallel的可能重复 @DavidJashi:关键字是不同的PHP脚本,我正在学习并行,谢谢! parallel 并不关心,无论是 PHP 还是 bash 或其他什么。行为和解决方案是一样的。 【参考方案1】:

这个问题被弹出了好几次,但我找不到合适的答案。我想现在我找到了一个很好的解决方案!

不幸的是,parallel 不是标准发行版的一部分,但 make 是。它有一个开关-j 来做并行。

man make(1)]: (more info on make's parallel execution)

  -j [jobs], --jobs[=jobs]
        Specifies the number of jobs (commands) to run simultaneously.  If
        there  is  more than one -j option, the last one is effective.  If
        the -j option is given without an argument, make  will  not  limit
        the number of jobs that can run simultaneously.

因此,使用适当的Makefile 可以解决问题。

.PHONY: all $(PHP_DEST)

# Create an array of targets in the form of PHP1 PHP2 ... PHP90
PHP_DEST := $(addprefix PHP, $(shell seq 1 1 90))

# Default target
all: $(PHP_DEST)

# Run the proper script for each target
$(PHP_DEST):
        N=$(subst PHP,,$@); php path$N/some_job_$N.php

它创建了 90 个 PHP# 目标,每个目标调用 php path#/some_job_#.php。如果您运行make -j 5,那么它将运行 5 个 php 实例并行。如果一个完成,它会开始下一个。

我将Makefile 重命名为parallel.mak,运行chmod 700 parallel.mak 并将#!/usr/bin/make -f 添加到第一行。现在可以叫./parallel.mak -j 5了。

甚至您可以使用更复杂的-l 开关:

  -l [load], --load-average[=load]
        Specifies  that  no new jobs (commands) should be started if there
        are others jobs running and the load average is at least  load  (a
        floating-point number).  With no argument, removes a previous load
        limit.

在这种情况下,make 将根据系统负载决定可以启动多少作业。

我用./parallel.mak -j -l 1.0 对其进行了测试并且运行良好。它起初并行启动了 4 个程序,相反 -j 没有 args 意味着尽可能多地并行运行。

【讨论】:

哇!感谢您的详细回答trueY!我的问题中提到的路径实际上只是示例,但我明白你的意思,我会尽力适应它,再次感谢你的帮助! @TheDude:我很高兴能为您提供帮助,并且我为这个问题找到了合适的解决方案。我以前多次遇到过这个问题,我只能三心二意地解决。 @TheDude:我在接收临时目标时做了一些小修改,以避免出现多个subst【参考方案2】:

使用cron 并同时安排它们。 或者使用parallel。

【讨论】:

以上是关于在任何给定时间运行 5 个脚本的主要内容,如果未能解决你的问题,请参考以下文章

用于确保在任何给定时间仅运行一个 shell 脚本的 shell 片段 [重复]

rc.d 脚本默认给定一个“开始”参数?

在给定时间后自动终止Linux进程/ php脚本

如何为每个用户顺序运行多个请求

脚本控制------------------------(at命令mail命令batch命令cron表格anacron表格)

有没有办法在 html 网站上运行多个脚本