Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    Killare processi duplicati utente

    Ciao Ragazzi,
    avrei bisogno di realizzare uno script che limiti il numero di processi "java" attivi per utente riducendoli ad uno solo per volta...
    Mi spiego meglio...
    Mettiamo che lanci: ps -A

    Avrei:

    PID TTY TIME CMD
    697 ? 00:24:45 java
    711 ? 00:07:54 java
    1398 ? 00:00:16 java
    2030 ? 00:00:00 scsi_eh_0
    ecc...

    prima di tutto dovrei avere una lista più simile a questa ( ciò in cui viene incluso il nome utente ):

    PID USER TIME CMD
    697 pippo 00:24:45 java
    711 pippo 00:07:54 java
    1398 pluto 00:00:16 java
    2030 paperino 00:00:00 scsi_eh_0

    Successivamente mediante un comando dovrei riuscire a killare il processo duplicato "java" per pippo ( in questo caso il 711 - il secondo processo "java" per l'utente pippo ), poichè "pippo" può aprire un solo processo java per volta...

    Come fare?

    Ciao!

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Questo dovrebbe andare

    codice:
    #!/bin/sh
    
    if [ "$#" -ne 1 ]
    then
    	echo "usage: $0 <process_name>"
    	exit 1
    fi
    
    lines=`ps -A | awk /"$1"$/'{print $1}' | wc -l | cut -d " " -f 1`
    
    if [ "$lines" -gt 1 ]
    then
    	kill `ps -A | awk /"$1"$/'{print $1}' | head -$(($lines-1))`
    fi
    
    exit 0
    va richiamato da shell col nome del processo di cui eliminare i doppioni, nel tuo caso

    codice:
    $ nome_script.sh java
    ti consiglio vivamente di non sbagliare a scrivere la stringa in input... ;D

    Questo però elimina tutti i doppioni senza badare all'utente che ha avviato il processo... volevo sapere: come va deciso di quale utente vanno eliminati i doppioni? E' un nome fisso (tipo "pippo" appunto) o cambia di volta in volta? In ogni caso basterebbe cambiare il comando ps aggiungendo l'opzione -U nome_utente, ma specifica meglio questo punto...
    every day above ground is a good one

  3. #3
    Ciao,
    a me non servirebbe semplicemente eliminare tutti i doppioni...
    Mi servirebbe eliminare i doppioni per utente...

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Allora bastano semplicemente queste modifiche:

    codice:
    #!/bin/sh
    
    if [ "$#" -ne 2 ]
    then
    	echo "usage: $0 <process_name> <user_name>"
    	exit 1
    fi
    
    lines=`ps -U $2 | awk /"$1"$/'{print $1}' | wc -l | cut -d " " -f 1`
    
    if [ "$lines" -gt 1 ]
    then
    	kill `ps -U $2 | awk /"$1"$/'{print $1}' | head -$(($lines-1))`
    fi
    
    exit 0
    e richiamare lo script ad esempio così

    codice:
    ./nome_script java pippo
    Ovviamente assicurati che l'utente che lancia lo script abbia i privilegi necessari per ammazzare i processi "incriminati"...
    every day above ground is a good one

  5. #5
    Potrebbe essere una soluzione, però considera che non so a priori l'utente che sta duplicando i processi...
    Quindi lo script dovrebbe determinare automaticamente l'utente che sta duplicando quel determinato processo e killare tutti quelli che gli appartengono tranne uno.

    Altrimenti dovrei lanciare lo script per ogni utente presente nel sistema ogni volta

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Ecco, proprio per questo chiedevo delucidazioni sulla scelta dell'utente in uno dei post precedenti...

    Originariamente inviato da magnus
    Altrimenti dovrei lanciare lo script per ogni utente presente nel sistema ogni volta
    Vabbè questo non è un problema dato che si può automatizzare tranquillamente. Vedi se questo va bene... l'ideale (in termini di tempo) sarebbe trovare gli utenti che hanno effettivamente processi duplicati e lavorare solo su quelli, ma si tratterebbe di fare modifiche troppo contorte allo script di prima.

    codice:
    #!/bin/bash
    
    if [ "$#" -ne 1 ]
    then
    	echo "usage: $0 <process_name>"
    	exit 1
    fi
    
    user_list=`cat /etc/shadow | cut -d ":" -f 1`
    
    for user_name in $user_list; do
    
    	lines=`ps -U $user_name | awk /"$1"$/'{print $1}' | wc -l | cut -d " " -f 1`
    
    	if [ "$lines" -gt 1 ]
    	then
    		kill `ps -U $user_name | awk /"$1"$/'{print $1}' | head -$(($lines-1))`
    	fi
    done
    
    exit 0
    Si presume chiaramente che chi avvia il processo sia un amministratore. Stavolta comunque basta scrivere

    # ./nome_script.sh <nome_processo>

    visto che verrà eseguito per tutti gli utenti.
    every day above ground is a good one

  7. #7
    #!/bin/bash

    if [ "$#" -ne 1 ]
    then
    echo "usage: $0 <process_name>"
    exit 1
    fi

    user_list=`cat /etc/shadow | cut -d ":" -f 1`

    for user_name in $user_list; do

    lines=`ps -U $user_name | awk /"$1"$/'{print $1}' | wc -l | cut -d " " -f 1`

    if ![ "$user_name" = "root" ]
    then
    if [ "$lines" -gt 1 ]
    then
    kill `ps -U $user_name | awk /"$1"$/'{print $1}' | head -$(($lines-1))`
    fi
    fi
    done

    exit 0
    Mi pare ottimo il tuo script... per non applicare la regola all'user root è corretta la modifica che ho riportato?


  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Potrebbe andare bene ma devi separare ! e [, altrimenti bash interpreterà ![ come un unico operatore o comando e ti dirà ![: command not found

    Puoi anche scrivere così

    codice:
    if [ ! "$user_name" = "root" ]
    o meglio ancora così

    codice:
    if [ "$user_name" != "root" ]
    hint: quando posti codice, usa i tag "code" non "quote" altrimenti si perde l'indentazione
    every day above ground is a good one

  9. #9
    Grazie mille per il supporto!!!

  10. #10
    Avrei un'ultima esigenza, cioè quella di killare tutti i processi tranne uno ma che però sia il più recente...

    In pratica lo script va bene, però dovrebbe rimanere attivo il processo di quel tipo più recente ( cosa che non sempre avviene ).

    Come potrei modificare lo script?

    Ciao!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.