hi
hope u guys are well... i am using a linux command (with system() call in my c++ code) to search all files with in the system and then store the results in the a file(say filename). i am piping this with tail --f filename to display the results while storing then in file 'filename'...

now as tail --f breaks when user breaks it( by ctrl +c) i was wondering is there anyother way to break this pipe
the command i am using is

find / -wholename= 'somename'>>filename | tail --f filename

my program doesn't continue until users breaks this command...
i was wondering whether there is a way to break this command when find is unable to find anynew file and append it to filename after some time interval....


my english is not very good if what i have written above is unclear please let me know....

i need to display the files found which are stored in filename at the same time on the terminal....

if i can not break from tail --f with out user break... is there anyother way e.g. let say that the file filename is checked after every 1 second to see if anything is written to it ...if anything is written to filename it is displayed ...if nothing gets written to file name say uptill 10 seconds the process breaks automatically...

i am sorry if this is the wrong question for this forum ..if that is the case can you please direct me to which forum i should put this question on thanks...i have searched on the net and books for a solution but i can not find any ..the closest thing i can think of it is to use the pid of find / -wholename='somename'>>filename to break the pipe but as i am a newbie i can not do that ..
thanks

Dani AI

Generated

— the reason the C++ program stays blocked is that the follower (the tail -f process) never exits, so the shell never returns control. The command in the first post mixes an append redirection with a pipe; when stdout is redirected into a file the pipe can end up with no data, which makes the whole setup behave unexpectedly. 's idea of duplicating output to both the terminal and a file was the right direction, and the "unexpected EOF" reported earlier most often comes from an unmatched quote or a script with DOS line endings rather than from tee itself — check any wrapper script for unterminated quotes.

A tidy, reliable pattern is: run find in the background, record its PID, then run tail with the --pid option so tail exits automatically when find finishes. Example:

# start the search in background and capture its PID
find / -path '*somename*' >> /tmp/search-results.log 2>/dev/null &
FINDPID=$!

# follow the file and exit as soon as the find process ends
tail --pid=$FINDPID -n +1 -f /tmp/search-results.log

Notes: --pid is supported by GNU tail; -n +1 shows existing matches before following. Redirecting stderr (shown above) silences permission errors that flood the screen.

If tail --pid is not available, alternatives are (a) use timeout to limit how long tail runs, (b) use inotifywait to watch the file for changes, or (c) implement a small monitor that checks the file modification time and exits after N seconds of inactivity. Also, when invoking from C++ prefer popen() or a proper fork/exec with pipes so the program can read output line-by-line instead of relying on external tail processes.

Recommended Answers

All 4 Replies

then do

find / -wholename='somename' -print | tee -a filename

Edit:

Although I am not familiar with "wholename" argument, I assume your find options are actually something different (and correct).

thanks for the reply... i checked
find / -wholename='somename' -print | tee -a filename
but i am getting an error which is "unexpected EOF encountered ". does the file filename has to contain something before i execute this command ??.... i thought this was happening because the file was empty and the only character the file had was the end of file character... but i entered sometext manually but i am still getting this error....
any suggestion??..

I would have to assume that it is coming from the tee (and that error will only occur on the file handle being read, not the filehandle being written), so I have to assume that the find command is not finding anything. But that also seems strange, as I believe that should have the same effect as doing

echo "" | tee -a filename

which as far as I know should not produce an error. Are you certain the error is happening here.

That error also occurs when a quoted string is not ended properly in the script so the shell continues reading the script as a part of the quoted string, but reaches the end of the file before reaching the end of the string as follows:

#!/bin/sh
var="this is an unfinished string
cat filename  # never gets executed as the shell still considers this a part of the string above
# here the script ends and produces the error given above as the string is not ended

hey sorry masjade for the late reply it did solve my problem thank you so much

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.