psycotica0
psycotica0

Reputation: 3460

Killing Subshell with SIGTERM

I'm sure this is really simple, but it's biting me in the face anyway, and I'm a little frustrated and stumped.

So, I have a script which I've managed to boil down to:

#!/bin/sh
sleep 50 | echo

If I run that at the command line, and hit Ctrl-C it stops, like I would expect.

If I send it sigint, using kill, it does nothing. I thought that was strange, since I thought those should have been the same.

Then, if I send it sigterm, then it also dies, but if I look in ps, the sleep is still running.

What am I missing, here?

This is obviously not the real script, which runs python, and it's more of a problem when it keeps running after start-stop-daemon tries to kill the daemon.

Help me people. I'm dumb.

Upvotes: 0

Views: 549

Answers (2)

Jordan Samuels
Jordan Samuels

Reputation: 997

The reason this happens is that the Ctrl-C is delivered to the sleep process, whereas the sigint you are sending is delivered only to the script itself. See Child process receives parent's SIGINT for details on this.

You can verify this yourself by using strace -p when hitting ctrl-c or sending sigint; strace will tell you what signals are delivered.

EDIT: I don't think you are dumb. Processes and how they work are seemingly simple, but the details are often complicated, and even experts get confused by this sort of thing.

Upvotes: 1

prashant thakre
prashant thakre

Reputation: 5147

I did the same thing I written script named as test.sh with below containt.

#!/bin/sh
sleep 50 | echo

After executing , I did Ctrl-C -> its working fine means closing it. Again executed and in another terminal i checked the PID by ps -ef|grep test.sh after finding the pid , i did kill <pid> and it killed the process , to verify again i executed ps -ef|grep test.sh and didnt get any pid.

Upvotes: 0

Related Questions