为什么我无法通过管道传输到output.txt或grep -v?

时间:2019-06-11 01:15:13

标签: bash

我需要能够通过此命令的输出进行grep。如果我在“完成”之后将其关闭,它会很好地工作,但是我无法搜索输出并且无法将其输出或使用grep。

|之后插入>>./binaryfile似乎也不起作用。

for i in {0..32767}; do 
    printf "AAAAAAAAAAAAA\x$(printf %x $i)" | ./binaryfile; 
    killall -s KILL binaryfile; 
done >> output.txt

我应该得到一个包含所有结果的可抓取文本文件。而是文件(或grep)完全为空。

1 个答案:

答案 0 :(得分:0)

如果循环中的killall有所作为,我认为这意味着二进制文件程序没有正确终止,否则killall根本没有任何作用,并且会显示一条错误消息(没有这样的过程或类似的东西这个)。 因此,我认为一开始您应该尝试弄清楚为什么该过程无法正确终止。也许它在父进程在出口运行时启动子进程。如果您不能阻止它轻松地执行此操作,则可以尝试在bash脚本中同步您的进程,这样您就不会遇到太多进程的问题(在它们可以做一些有趣的事情之前将其杀死)解决问题)。

例如,如果编译并运行此脚本,则会注意到您得到一个shell提示,而程序仍输出消息:

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

void main(void) {
        pid_t parent_pid;
        pid_t my_pid;
        long i,j;

        parent_pid= getpid();

        fork();
        if(getpid() == parent_pid) {
                printf("I'm the parent process, Ill terminate\n");
                exit(1);
        } else {
                printf("I'm the child process, I'll live a bit longer\n");
                for(i=0;i < 100;i++) {
                        printf("Iteration %ld\n", i);
                        for(j=0;j < 500000000; j++);
                }
        }
}

因此,我认为您需要同步您的进程或确保该程序已终止,然后才能再次启动它。似乎对于上面的示例,我不能使用wait(我的意思是shell命令),但是如果没有其他可能性,则可以在shell脚本中添加一些内容(例如,尽管我知道这有点尴尬):

while pgrep binaryfile > /dev/null ; do
    sleep 2s
done