Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

I try to write a function in .bash_profile to define a function for process killing as follows:

function pkill {
                pid = ps -elf|grep python|grep $1|awk -F " " '{print $4}'
                kill -9 pid
}

And what I want to do is using "pkill keyword" to kill the process that pid=[ps -elf|grep python|grep keyword|awk -F " " '{print $4}'],and my code didn't work.How should I write this function?

about kill:
my python process is multithreaded.I've tried kill pid,kill -TERM pid,orkill -INT pid,but still can find it in the processlist.So I used 'kill -9'.

share|improve this question
    
just a sidenode: do you have a system command pkill (linux.die.net/man/1/pkill) available on your system? –  akira Mar 10 '10 at 12:55
2  
    
@akira:oops,there is one already:0 –  SpawnST Mar 11 '10 at 0:57
    
@Dennis Williamson:That's right.Thanks for your advice. –  SpawnST Mar 11 '10 at 1:00
1  
upvoting needs 15 reputation?o_o –  SpawnST Mar 11 '10 at 1:12

3 Answers 3

up vote 3 down vote accepted
pid=$(ps -elf|grep vim|grep 'screenrc' | awk -F" " '{print $4}')

But you might be able to use pgrep instead:

pid=$(pgrep -f "python .*$1")

or

pids=$(pgrep -d' ' -f "python .*$1")
kill -9 $pids

If you're feeling confident (reckless!):

\pkill -9 -f "python .*$1"
share|improve this answer
1  
Or just pkill -f "python .*$1", as pkill always comes with pgrep. –  grawity Mar 10 '10 at 12:58
    
That's nice.Thank you. –  SpawnST Mar 11 '10 at 1:17

Is there a reason you're listing and then discarding a ton of extra junk?

(I assume you're using GNU ps, but I prefer BSD ps syntax. It's supported by GNU ps, too, because GNU ps supports everything.)

 # as others have noted 'pkill' is an existing command, so let's not clash with its name
 function pypkill {
      pids=$(ps ax -opid= -ocomm= | grep python | grep "$1" | awk -F " " '{print $1}')
      kill -TERM $pids
 }

Breakdown:

  • pids=
    • The sub shell may return more than one PID. This captures all of them
  • $( )
    • a subshell. Commands inside the parentheses will be executed and their output returned in place.
  • ps ax
    • shows all processes on the system (BSD syntax)
  • -opid= -ocomm=
    • tells ps to output two columns: PID and command name, and to ommit the header line
  • kill -TERM $pids
    • Using kill -9 is a last resort. In most cases kill -TERM is what you want, or possibly kill -INT, before resorting to kill -KILL.
share|improve this answer
    
That's helpful.Thank you. –  SpawnST Mar 11 '10 at 1:14

Shouldn't that be more like

  pid=$(ps -elf|grep python|grep $1|awk -F" " '{print $4}')
  kill -9 $pid
share|improve this answer
    
It seems still not work,error info said: bad substitution.:( –  SpawnST Mar 10 '10 at 9:03
    
@SpawnST: Sorry, I don't have bash here to try it out, I was just guessing. :( –  Bobby Mar 10 '10 at 9:25
1  
remove the space between -F and " " –  njd Mar 10 '10 at 12:55
1  
It should be $( ), not ${ }. –  grawity Mar 10 '10 at 12:56
    
@njd, grawity: Thanks! –  Bobby Mar 10 '10 at 13:02

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.