有时候我们想对收集系统中某一些进程中的所有线程信息,这个时候写一个简单的脚本来实现。
这里针对实际的例子进行讲解。
这里写来一个创建来三个线程的进程threadtest.c 。
#include
#include
#include
#include /* asked by va_star and va_end */
pthread_t ntid1, ntid2, ntid3;
static int CHILD = 0;
void die(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
vfprintf(stderr, fmt, args);
va_end(args);
fflush(stdout);
fflush(stderr);
exit(1);
}
void * thr_fn1(void *arg) {
printf("CHID%d,tid=%d\n", CHILD++, (int)(pthread_self()));
while(1);
}
void * thr_fn2(void *arg) {
printf("CHID%d,tid=%d\n", CHILD++, (int)(pthread_self()));
while(1);
}
void * thr_fn3(void *arg) {
printf("CHID%d,tid=%d\n", CHILD++, (int)(pthread_self()));
while(1);
}
int main(int argc, char *argv[]) {
int err;
err = pthread_create(&ntid1, NULL, thr_fn1, NULL);
if (err != 0) {
die("can't create thread\n");
}
err = pthread_create(&ntid2, NULL, thr_fn2, NULL);
if (err != 0) {
die("can't create thread\n");
}
err = pthread_create(&ntid3, NULL, thr_fn3, NULL);
if (err != 0) {
die("can't create thread\n");
}
while(1);
}
gcc -pthread -o threadtest threadtest.c
然后复制两个此可执行文件即最终为:threadtest, threadtest1, threadtest_2, 然后运行这个三个可执行文件,通过ps -L查看这些3个任务及其线程的情况如下所示:
图1 三个进程及其子线程
线程的手机主要通过shell脚本来搞定。整个流程很简单:1 先通过进程共有的名字找到进程的pid; 2 再通过这些pid找到各自线程的tids,然后将它们收集到一个文件中。
这里还做了一点,将有下划线的进程给排除掉,用的是 grep -v test_ 来处理的,如下所示:
#!/bin/bash
datasets=$(ps | grep threadtest | grep -v test_ | awk '{print $1}')
for i in $datasets
do
tidsets=$(ps -L | grep $i | awk '{print $2}')
for j in $tidsets
do
echo $j >> ./tids
done
done