I am trying to improve my command line skills and I have encountered a problem where I cannot kill a process. I type kill 2200
where 2200 is my PID and the process is not killed. After few minutes wait is still in the top
and ps aux
.
I have even tried typing it with sudo - no results.
Any ideas why it would be like that ?
EDIT
I have found a weird dependency, where fg
updates the processes list:
x@xxx:/etc/grub.d$ ps
PID TTY TIME CMD
1723 pts/0 00:00:00 bash
2200 pts/0 00:00:00 top
2202 pts/0 00:00:00 top
2258 pts/0 00:00:00 ps
x@xxx:/etc/grub.d$ fg
top
x@xxx:/etc/grub.d$ ps
PID TTY TIME CMD
1723 pts/0 00:00:00 bash
2200 pts/0 00:00:00 top
2620 pts/0 00:00:00 ps
x@xxx:/etc/grub.d$ fg
top
x@xxx:/etc/grub.d$ ps
PID TTY TIME CMD
1723 pts/0 00:00:00 bash
2621 pts/0 00:00:00 ps
Processes can ignore some signals. If you send SIGKILL it will not be able to ignore it (and neither catch it to do cleanups). Try:
Learn more by reading the manual page:
If
kill
is invoked without any parameter, it sends the signal number 15 (SIGTERM
). This signal can be ignored by the process. This signal notifies the process to clean his things up and then end correctly by himself. That's the nice way.You can also "send" the signal number 9 (
SIGKILL
) that cannot be ignored by the process. The process will even not recognize it, because the kernel ends the process, not the process itself. That's the evil way.One says
kill -9 <pid>
always works. That's a misbelief. There are situations where evenkill -9
does not kill the process. For example when a process has the stateD
(uninterruptable sleep). A process comes into this state everytime it waits for I/O (normally not very long). So, if a process waits for I/O (on a defect harddisk for example) and it is not programmed properly (with a timeout), then you simply cannot kill the process. No matter what you do. You just can try to make the file accessible that the process continues.Despite it's name kill doesn't actually kill processes, it sends signals to it. From the man page:
kill - send a signal to a process
The default signal sent by
kill [pid]
is SIGTERM which usually but not necessarily asks the process to terminate. It's quite possible to write a program that plays a happy tune when you send the SIGTERM signal to it, but not recommended.Another common signal is SIGHUP which is often used to ask a program to reread its configuration files.
If you really want to kill a program you need to use the SIGKILL signal by doing
kill -9 [pid]
.It sounds like you might be suspending a process (perhaps by pressing Ctrl-Z in the terminal). In this state, your process will not respond to a SIGTERM as it is frozen. Running 'fg' thaws the process, so it can pick up the signal and self-terminate. That could explain why 'fg' appears to update the process list.
This is what i used to pill localhost running on port 80 (By angular cli) Get running app info on port 80
where
3348
is pid of the running processFrom within C++, I executed:
And on a linux(Ubuntu) terminal,
The output was:
Seemingly, it (4024) still surviving. However, as soon as I terminated the parent process which called the above "kill" statement, 4024 didn't appear any more. Now I judge "defunct" process is nothing more than a line displayed and decided to ignore it. I hope my experience could help someone out there. Cheers!
You also may use
kill -l
to display the supported signals by your architecture, and learn more about the signal you may wish to use to properly send a signal.Note: as others may have mentioned, the use of
kill -9 {PID}
is not recommended unless its a zombie process. once a process receives a SIGKILL will shutdown immediately without cleaning or any other proper procedures.If you trying to kill a process with PID and it still runs on another PID, it looks like you have started that process in a different account most probably root accout. so Login in with
sudo su
and kill it