I have the following script which has been running for over 3 days:
seq -w 1 1000000 | while read i; do (./myscript.pl $i >> output.txt); done
Is it possible to find out how far it has got with the sequence?
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. It only takes a minute to sign up.Sign up to join this community
Since you're calling a command with a different argument for each element, check what argument that command is currently processing.
ps w -C myscript.pl
You can get an approximate value by checking how many
write system calls the
seq process has performed. Find the process ID with
pgrep seq (or some other command such as
ps uw -C seq if there are multiple
seq processes and you need to identify which one you want). If the PID is
grep syscw /proc/1234/io
reads some IO statistics of the process from
/proc¹. Add one to this value² then multiply by
getconf PIPE_BUF /, which is 4096, to get the number of bytes that
seq has written. This is the total length of all the numbers that it's written so far. Since you're printing constant-width lines, divide by 8 to get the number of numbers written so far.
A more convenient way to see how far
seq has gone is to trace its system calls with
strace. On Ubuntu, by default, you need to be root to do this.
$ strace -p1234 strace: Process 1234 attached write(1, "0008193\n0008194\n0008195\n0008196\n"..., 4096^Cstrace: Process 1234 detached
In the example above, 8193 is the next number that
seq will write to the pipe, when the reading side has finished processing 8192 and is ready for more.
seq was writing to a regular file, then
cat /proc/1234/1/fdinfo or
lsof -p1234 would reveal the offset in the file, which is the number of bytes that
seq has written. But for a pipe you don't get this information.
² Determined experimentally. Offhand I don't know why the first write operation writes twice
I don't know what your script does, but could you
watch cat output.txt in another terminal to monitor what your output file looks like?
Alternatively (and I know this isn't what you're asking for) perhaps run your command like this:
seq -w 1 1000000 | while read i; do (./myscript.pl $i >> output.txt & echo i); done
seq -w 1 1000000 | while read i; do (./myscript.pl $i tee -a output.txt); done
pv pipe view util:
seq -w 1 1000000 | pv -lcs 1M | while read i; do (./myscript.pl $i >> output.txt); done
...which will output to STDERR a constantly updated progress bar giving both the number of lines read, and the percentage of lines done at the moment.