Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.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
Bash 将标准输出重定向到包含日志记录过程pid的文件_Bash_Scripting - Fatal编程技术网

Bash 将标准输出重定向到包含日志记录过程pid的文件

Bash 将标准输出重定向到包含日志记录过程pid的文件,bash,scripting,Bash,Scripting,我已经搜索了一段时间,但我既找不到答案,也找不到自己的解决方案,所以我求助于你们。我在这里要问的第一个问题:) 我希望运行同一程序的多个实例,并将这些程序的每个标准输出重定向到包含同一进程pid的文件,类似于: my_program > <pid of the instance of my_program that is called in this command>.log my\u program>.log 我意识到这还不算是最后一步:p我已经对exec和$PPID进行

我已经搜索了一段时间,但我既找不到答案,也找不到自己的解决方案,所以我求助于你们。我在这里要问的第一个问题:)

我希望运行同一程序的多个实例,并将这些程序的每个标准输出重定向到包含同一进程pid的文件,类似于:

my_program > <pid of the instance of my_program that is called in this command>.log
my\u program>.log

我意识到这还不算是最后一步:p我已经对exec和$PPID进行了修改,但没有任何效果。我的巴什福很弱:|请帮帮我,给我指个地方!谢谢

在创建流程之前,您无法知道流程的PID


因此这是不可能的,您应该重写被调用的程序,使用
getpid()
从自己的PID伪造日志名。

您可以将程序执行包装到bash脚本中。bash进程将在调用
exec
时替换为您的程序。因此:

#!/bin/bash
exec my_program > $$.log

这解决了我的问题!谢谢实际上,我尝试了类似的方法,只是没有将脚本作为单独的bash作业运行,以便exec可以用我的_程序替换bash实例,我尝试了相同的概念,但对bash使用了-c命令行选项,但没有起作用。bash-c“exec echo$$”输出3357在同一shell上,echo$$输出3357@ticklemynausea:您需要考虑一下,
$
实际上何时被bash替换为值。如果您编写(我们大多数人都是这样做的)
bash-c“exec sleep 300>$$.log”
,则
$$
不会被我们将要运行的bash所取代,而是被父(例如当前)bash所取代!现在感受一下区别:
bash-c'exec sleep 300>$$.log'