une fonction dans .bash_profile

1

J'essaie d'écrire une fonction dans .bash_profile pour définir une fonction de destruction de processus, comme suit:

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

Et ce que je veux faire est d'utiliser "mot-clé pkill" pour tuer le processus qui pid = [ps-même | grep python | mot-clé grep | awk -F "" '{print $ 4}']], et mon code n'a pas fonctionné .Comment devrais-je écrire cette fonction?

à propos de kill:
mon processus python est multithread.J'ai essayé kill pid, kill -TERM pidou kill -INT pid, mais je peux toujours le trouver dans la liste de processus.

SpawnST
la source
juste un sidenode: avez-vous une commande système pkill( linux.die.net/man/1/pkill ) disponible sur votre système?
akira
@akira: oups, il y en a déjà un: 0
SpawnST
@ Dennis Williamson: C'est vrai. Merci pour vos conseils.
SpawnST
1
15 points de réputation à gagner? o_o
SpawnST

Réponses:

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

Mais vous pourriez peut-être utiliser pgrep à la place:

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

ou

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

Si vous vous sentez confiant (téméraire!):

\pkill -9 -f "python .*$1"
njd
la source
1
Ou juste pkill -f "python .*$1", comme pkilltoujours avec pgrep.
Grawity
2

Y a-t-il une raison pour laquelle vous listez puis jetez une tonne de bric-à-brac?

(Je suppose que vous utilisez GNU ps, mais je préfère la syntaxe BSD ps. Elle est également prise en charge par GNU ps, car GNU ps supporte tout.)

 # 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
 }

Panne:

  • pids =
    • Le sous-shell peut renvoyer plusieurs PID. Cela capture tous
  • $ ()
    • un sous-shell. Les commandes entre parenthèses seront exécutées et leur sortie retournée à la place.
  • ps hache
    • affiche tous les processus du système (syntaxe BSD)
  • -opid = -ocomm =
    • indique à ps de sortir deux colonnes: PID et nom de la commande, et d'omettre la ligne d'en-tête
  • kill -TERM $ pids
    • Utiliser kill -9 est un dernier recours. Dans la plupart des cas, kill -TERM est ce que vous voulez, ou éventuellement kill -INT, avant de tuer kill -KILL.
Phogg
la source
0

Ça ne devrait pas être plus comme

  pid=$(ps -elf|grep python|grep $1|awk -F" " '{print $4}')
  kill -9 $pid
Policier
la source
Il semble que ça ne marche toujours pas, info erreur dit: mauvaise substitution. :(
SpawnST
@SpawnST: Désolé, je n'ai pas la bash pour l'essayer, je devinais. :(
Bobby
1
supprimer l'espace entre -F et ""
njd
1
Ce devrait être $( ), pas ${ }.
grawity