从正在运行的bash脚本中检索完整的命令行(w / pipes& c)

时间:2015-12-25 11:24:37

标签: bash

如何在这行中运行的脚本中获取bash中运行的完整代码?

ping -c 2 google.com & ping -c 2 aol.com | grep aol & sh myscript.sh

我想以某种方式检索myscript.sh中的完整上线。 我目前的做法是:

 ping -c 2 google.com & ping -c 2 aol.com | grep aol & ps -ef --sort=start_time

然后关联PPID和流程的开始时间以获取运行的内容。

UID  PID   PPID  C STIME TTY          TIME CMD
nm+  2881  6599  0 12:09 pts/1    00:00:00 ping -c 2 google.com
nm+  2882  6599  0 12:09 pts/1    00:00:00 ping -c 2 aol.com
nm+  2883  6599  0 12:09 pts/1    00:00:00 grep --color=auto abc
nm+  2884  6599  0 12:09 pts/1    00:00:00 ps -ef --sort=start_time

我不喜欢它,因为我无法说明进程是如何连接的(管道或只是并行执行),因此无法重建在bash中运行的确切行。也是以正确的方式破解的感觉。

2 个答案:

答案 0 :(得分:1)

你可以grep" pipe"从lsof中找到进程的管道标识中的相关命令,找到进程标识并查找相关进程的详细信息。

答案 1 :(得分:0)

假设bash 4.0或更新版本:

#!/usr/bin/env bash
exec 3>"$1"; shift
BASH_XTRACEFD=3 PS4=':$BASH_SOURCE:$LINENO:+'
set -x
source "$@"

...如果保存为bash_trace,则用作:

bash_trace logfile scriptname arg1 arg2 ...

...然后,要查找实际行号,可以使用以下内容:

IFS=: read -r filename lineno _ < <(tail -n 1 logfile)
sed -e "${lineno}q;d" <"$filename"