Bash 将标准输出重定向到包含日志记录过程pid的文件
我已经搜索了一段时间,但我既找不到答案,也找不到自己的解决方案,所以我求助于你们。我在这里要问的第一个问题:) 我希望运行同一程序的多个实例,并将这些程序的每个标准输出重定向到包含同一进程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进行
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'