我一直在做一项简短的任务,以便在数据库中的死锁被识别后立即确定它。为此,一旦我将其转储到文本文件中,我将定期监视流程详细信息。
经过一定的操作后,要监视的输出文件(微型版本)是:
输入文件:-
SPID BLOCKING SPID
23 50
71 46
50 60
60 96
这意味着进程 23 被进程 50 阻塞,进而被进程 60 阻塞。 所以在这种情况下,流程链依赖关系是 23->50->60->96,其他是 71->46 简而言之,我想要最终的罪魁祸首......在本例中是 96 和 46 以及链计数(4 和 2)
输出文件:-
CULPRIT SPID CHAIN_COUNT
1) 96 4
2) 46 2
为此,必须循环整个文件并将第 2 列与文件中的任何第 1 列相匹配进行比较。必须重复此操作,直到第 2 列没有匹配项
我需要通过 awk 或 sed 来实现这一点,但是我相信这可以通过链接来实现 列表。
欢迎任何建议
****JS 还有一个问题,用于示例文件
SPID BLOCKING SPID
45 11
12 34
34 35
23 60
71 45
60 71
OUTPUT I RECEIVE:
71=>45
23=>60->71
12=>34->35
OUTPUT I AM SUPPOSED TO GET
23=>60=>71=>45
12=>34->35
我希望你明白我想说的。
最佳答案
让我们尝试分两步解决这个问题。第一步是我们将使用您的输入文件创建链(假设这对您返回并检查踪迹可能有用):
awk '
NR>1 {
for(value in values) {
if ($1 == values[value]) {
chain[$1] = chain[value] "->" $2;
values[$1] = $2;
delete chain[value];
delete values[value];
next
}
}
values[$1] = $2;
chain[$1] = $1 "->" $2
}
END {
for(left in values) {
for(c in chain) {
x = split(chain[c],t,/->/)
if (left == t[x]) {
chain[left] = chain[c] "->" values[left]
delete chain[c]
values[left]
}
}
}
for (trail in chain) print chain[trail]
}' file
对于您的输入文件,输出如下:
23->60->71->45->11
12->34->35
现在我们将上面的脚本传输到另一个 awk
进行格式化。
awk -F'->' '
BEGIN {
OFS="\t";
print "CULPRIT SPID", "CHAIN_COUNT"
}
{
print $NF, NF
}'
这将给出输出:
CULPRIT SPID CHAIN_COUNT
11 5
35 3
正如我之前所说的假设您需要查看路线。如果跟踪对您没有用,那么您可以简单地执行以下操作:
awk '
BEGIN {
OFS="\t";
print "CULPRIT SPID", "CHAIN_COUNT"
}
NR>1 {
for(value in values) {
if ($1 == values[value]) {
chain[$1] = chain[value] FS $2;
values[$1] = $2;
delete chain[value];
next
}
}
values[$1] = $2;
chain[$1] = $1 FS $2
}
END {
for(left in values) {
for(c in chain) {
x = split (chain[c],t)
if (left == t[x]) {
chain[left] = chain[c] FS values[left]
delete chain[c]
values[left]
}
}
}
for(v in chain) {
num = split(chain[v], culprit)
print culprit[num], num
}
}' file
输出将是:
CULPRIT SPID CHAIN_COUNT
11 5
35 3
您可以根据需要将其重定向到输出文件。
关于bash - 操作文件内容以确定死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23166577/