Following the advice from How to terminate a python subprocess launched with shell=True
I have a process that I start with the following
process = subprocess.Popen(my_cmd, shell=True, executable='/bin/bash', preexec_fn=os.setsid)
my_cmd is in the form of some_cmd_that_periodically_outputs_to_stdout | grep "some_fancy_regex" > some_output_file.txt
I kill the process with the following
os.killpg(os.getpgid(process.pid), signal.SIGKILL)
After killing, I get the following warning
ResourceWarning: subprocess XXX is still running
Why am I getting this warning?
The kill() is a built-in method used for terminating a single subprocess. The kill() command keeps running in the background.
We should avoid using 'shell=true' in subprocess call to avoid shell injection vulnerabilities. In this call you have to pass a string as a command to the shell. If call_method is user controlled then it can be used to execute any arbitrary command which can affect system.
Setting the shell argument to a true value causes subprocess to spawn an intermediate shell process, and tell it to run the command. In other words, using an intermediate shell means that variables, glob patterns, and other special shell features in the command string are processed before the command is run.
By default, running subprocess. Popen with shell=True uses /bin/sh as the shell. If you want to change the shell to /bin/bash , set the executable keyword argument to /bin/bash .
You didn't wait
for the process to end. Even if you kill the process, you're still supposed to wait
for it so you don't have a zombie process hanging around. Python is warning you that you didn't wait
.
Add a process.wait()
call after killing it.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With