【问题标题】:How can I spawn n threads of a script, each with their own process id?如何生成脚本的 n 个线程,每个线程都有自己的进程 ID?
【发布时间】:2016-01-09 20:21:29
【问题描述】:

我想启动一个脚本的 n 个线程,每个线程都有自己的进程 ID。

我目前通过cronjob 这样做:

* * * * *    php /path/to/script.php >> /log/script.log 2>&1
* * * * *    php /path/to/script.php >> /log/script.log 2>&1
* * * * *    php /path/to/script.php >> /log/script.log 2>&1

这三个线程中的每一个都记录到同一个script.log,它将输出与其pid配对。

如果不从脚本复制/粘贴,我该如何做同样的事情?

以下是否会使用不同的pid(可从phpgetmypid() 访问)生成每一个?或者他们会共享同一个script-launcher.sh pid?

#!/bin/bash
# Let's call this `script-launcher.sh`
# Launch 3 threads at once with `script-launcher.sh 3`

N=${1-0}
for i in {1..$N}
do
   php /path/to/script.php >> /log/script.log 2>&1
done

【问题讨论】:

  • 所有正在运行的进程都有一个唯一的 pid。
  • 我理解你的意思吗,使用上面的例子,script-launcher.sh 100 会产生 100 个script.php 进程,每个进程都有自己的pid
  • 我认为这可以帮助您stackoverflow.com/questions/19543139/… 您想为您的脚本启动更多并行进程,对吗?当你启动一个进程时,他会自动获取一个 pid。
  • @Ryan 绝对。如果每个正在运行的进程都没有唯一的进程,那么 pid 将毫无意义。进程可以共享诸如父 ​​pid、可能的文件描述符、其他资源之类的东西。但是 pid 是唯一且不变的。

标签: php multithreading bash shell


【解决方案1】:

每当您跨越一个新进程时,新进程都会获得一个新的 pid。所以在这种情况下,每次你的 shell 脚本跨越一个 php 实例时,每个 php 副本都会有自己的 pid。

但是,{1..$N} 语法不起作用,因此您需要将脚本更改为

N=${1-0}
for i in $(seq 1 $N)
do
   php /path/to/script.php >> script.log 2>&1
done

然后,如果您将脚本称为script-launcher.sh 42,您将获得 42 个 PHP 实例运行。

要让您的 php 脚本在后台(异步)运行,请使用 & 指示 bash:

   php /path/to/script.php >> script.log 2>&1 &

【讨论】:

  • 如何异步运行这些?看起来循环中的每个进程首先等待前一个进程完成。
  • @Ryan 我用如何做到这一点更新了答案。 (在命令末尾添加&。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-23
  • 2012-04-18
  • 2021-12-18
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多