Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

I have two instances of a process running. One of them is "frEAkIng oUT!" and printing errors non stop to STDOUT.

I want to kill the broken process but I have to make sure I don't terminate the wrong one. They were both started about at the same time and using top I can see they both use about the same amount of memory and CPU. I can't seem to find anything that points to which process is behaving badly.

The safest thing would be to figure out which process/pid is writing to STDOUT.

Is there any way to do that?

share|improve this question
1  
Writing to stdout would mean writing to its file descriptor 1 ((of the process in question) which may be anything like a terminal or /dev/null). Are you sure you don't mean a particular file instead (like a terminal device, or a log file...)? –  Stéphane Chazelas Jul 2 at 13:26
    
If they were both started in the same shell then they're both writing to STDOUT, so pinning this will not help you identify which of the 2 to kill. Jofel's method is likely what you're looking for. –  slm Jul 2 at 13:38
    
What he really means is which one is producing output on the terminal. –  Barmar Jul 2 at 20:01
add comment

2 Answers 2

up vote 11 down vote accepted

On Linux, assuming you want to know what is writing to the same resource as your shell's stdout is connected to, you could do:

strace -fe write $(lsof -t "/proc/$$/fd/1" | sed 's/^/-p/')

That would report the write() system calls (on any file descriptor) of every process that have at least on file descriptor open on the same file as fd 1 of your shell.

share|improve this answer
    
That is what I had in mind initially, I will try both methods thanks to you both. –  TCZ8 Jul 2 at 14:02
add comment

You can stop both processing by sending them SIGSTOP (replace pid1 and pid2 by the actual PIDs or use killall and the application name):

kill -SIGSTOP pid1 pid2

The printing on the terminal (or wherever stdout is redirected to) should stop. Then continue one of them using

kill -SIGCONT pid1

If the error messages appear immediately, you know its the first process. If not you can stop it again and continue the second...

Before killing a stopped process, it is good practise to send first SIGCONT.

The same technique can be used with Ctrl-Z and the shell job controls (fg %1, bg %1, kill %1, ...).

share|improve this answer
    
Thats a very good way to troubleshoot it but i was really looking for a way to trace who is writting to terminal. Thank you –  TCZ8 Jul 2 at 14:02
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.