shell脚本实现循环抓取某个程序的pstack日志,这个程序有名字相同的多个进程id。并且在每次向日志里输入pstack命令执行时的当前时间,当程序的某个进程id变更时,停止脚本。并打印变更的进程id.
时间: 2023-12-03 19:43:56 浏览: 114
可以使用`ps`命令来获取程序相同的多个进程id,然后在循环中对每个进程id执行pstack命令。实现如下:
```shell
#!/bin/bash
# 程序名
program_name="your_program_name"
# 当前进程id
current_pid=""
# 循环抓取pstack日志
while true; do
# 获取程序相同的多个进程id
pids=$(ps -ef | grep "${program_name}" | grep -v grep | awk '{print $2}')
# 判断当前进程id是否变更
if [[ "${pids}" != *"${current_pid}"* ]]; then
# 打印变更的进程id
echo "Process ID changed: ${current_pid} -> ${pids}"
break
fi
# 记录当前进程id
current_pid="${pids}"
# 执行pstack命令并输出到日志文件中
echo "[$(date)] pstack ${pids}" >> pstack.log
pstack ${pids} >> pstack.log
# 等待5秒后继续循环
sleep 5
done
```
在上面的脚本中,我们使用了`ps`命令来获取程序相同的多个进程id,并通过变量`current_pid`来记录当前进程id。在每次循环中,我们判断当前进程id是否变更,如果变更了就停止脚本并打印变更的进程id。同时,在向日志文件中记录pstack命令执行的时间和结果后,我们使用`sleep`命令来等待5秒继续循环。
阅读全文