#!/bin/bash

clear
printf "\e[32;5;1mNao sou programador,entao desculpe-me pela P.O.G (Programacao orientada a Gambiarra) \e[m\040\040" ;



Menugerenciador () 
{
  clear
   echo "_____________________________________________________________________________"
   echo "|                                                                            |"
   echo "|                          GERENCIADOR DE PROCESSOS                          |"
   echo "|                             Gerenciador  SHELL                             |"
   echo "|____________________________________________________________________________|"
   echo "|  Opcoes:                                                                   |"
   echo "|                                                                            |"
   echo "| 1. Verificar se o Processo esta rodando (Saber PID)                        |"
   echo "| 2. Parar processo (Atraves do PID)                                         |"
   echo "| 3. Iniciar processo (Atraves do PID)                                       |"
   echo "| 4. Matar Processos                                                         |"
   echo "| 5. [AVANCADO] Utilizar o Gerenciador de Processos padrao do Linux (TOP)    |"
   echo "| 6. [Ler TEXTO] Informacoes sobre gerenciamento de processos                |"
   echo "| 7. Processos ZOMBIE (Fechados,mas continuam pendentes)                     |"
   echo "| 8. Utilizar a Ferramenta ATOP (Top Otimizado)                              |"
   echo "|                                                                            |"
   echo "| 0. Sair                                                                    |"
   echo "|                                                                            |"
   echo "|____________________________________________________________________________|"
   echo -n "Qual a opcao desejada?"
   read opcao1
   case $opcao1 in
   1) P1 ;;
   2) P2 ;;
   3) P3 ;;
   4) Assassino ;;
   5) Gerenciadorlinux ;;
   6) Texto ;;
   7) thewalkingdead ;;
   8) attop ;;
   0) exit ;;
   *) echo "Opcao desconhecida,voltando ao menu..."; Manugerenciador ;;
   esac
   
}

           
thewalkingdead(){
echo ""
echo "Para matar processos separadamente,liste,anote o PID e mate o processo atraves da fumcao -> Gerenciador Processos -> 4. Matar processos"
echo "1. Listar Processos ZOMBIE"
echo "2. Matar Processos ZOMBIE"
echo -n "Qual a opcao desejada?"
read dead
case $dead in
1) listah ;;
2) daryl ;;
esac
}

listah(){
  clear
  echo "Listando processos Zombie..."
  sleep 2
  ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'
  echo "Processos listados."
  echo 
  echo -n "Pressione Enter para voltar ao menu Gerenciador de Processos..."
  read key
  Menugerenciador
  }
   daryl(){
   clear
   echo "Matando processos ZOMBIE..."
   sleep 2  
   sudo kill -HUP `ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]' | awk '{print $2}'`
echo 
echo -n "Pressione Enter para voltar ao menu Gerenciador de Processos..."
read key
Menugerenciador
}

Gerenciadorlinux(){
   echo
   clear
   echo "Iniciando Gerenciador de Processos do Linux (TOP)"
   sudo top
   echo "Na Opcao 7 do menu Gerenciador,tem o TEXTO explicativo,te ajudara a usar o TOP"
   sleep 4
   clear
   echo -n "Pressione Enter para voltar ao menu Gerenciador de Processos..."
   read key
   Menugerenciador
}

attop() {
   clear
   sleep 1
   pacote=$(dpkg --get-selections | grep "atop" ) 
   echo 
   echo -n "Verificando se o Pacote 'atop' esta instalado ..."
   sleep 2
   if [ -n "$pacote" ] ;
   then echo
     echo "Pacote 'atop' ja Instalado"
     else echo
     echo "Pacote 'atop' Necessario-> Nao instalado"
     echo "Instalando Automaticamente Pacote Dialog..."
     sudo apt-get install atop
fi
   echo "Executando... Tecle (q Enter) para Fechar."
   sleep 3
   sudo atop
   clear
   echo -n "Pressione Enter para voltar ao menu Gerenciador de Processos"
   read key
   Menugerenciador
   }


P1() {
   clear
   sleep 2
   clear
   echo -n "Informe o Nome do Programa ou Processo: "
   read programa
   echo "Executando... Tecle (q Enter) para Fechar."
   sleep 3
   ps aux | grep $programa | less
   clear
   echo -n "Pressione Enter para voltar ao menu Gerenciador de Processos"
   read key
   Menugerenciador
   }

   P2(){
   clear
   echo "Obtenha o PID do processo utilziando a opcao 1"
   sleep 3
   clear
   echo
   echo -n "Informe o pid do processo: "
   read pid
   echo "Parando processo..."
   kill -19 "$pid"
   echo
   echo "Parando processo auto-executavel na inicializacao do S.O (/etc/init.d) atraves do Nome do Processo..."
   echo
   sleep 4
   echo -n "Informe o Nome do Programa ou Processo: "
   read programa
   source "$INICIALIZAR"
   sudo /etc/init.d/$programa stop
   echo
   echo
   sleep 10
   echo "Qualquer duvida consulte o arquivo de TEXTO"
   clear
   echo -n "Pressione Enter para voltar ao menu Gerenciador de Processos"
   read key
   Menugerenciador
   }
      P3(){
      clear
      echo "Obtenha o PID do processo utilziando a opcao 1"
      sleep 3
      clear  
      echo -n "Informe o pid do processo: "
      read pid
      echo "Reinciando processo..."
      kill -18 "$pid"
      echo 
      echo "Qualquer duvida consulte o arquivo de TEXTO"
      sleep 3
      clear 
      echo -n "Pressione Enter para voltar ao menu Gerenciador de Processos"
      read key
      Menugerenciador
      }
          Assassino(){
          clear
          echo "1. Matar processo informando o nome"
          echo "2. Matar processo informando o PID"
          echo -n "Qual a opcao desejada?"
          read decisao
          case $decisao in 
          1) matanome ;;
          2) matapid ;;
          esac
          }

      matanome(){
          echo "Informe o nome do processo: "
          read processo
          echo "Matando processo..."
          killall $processo
          sleep 2
          echo -n "Pressione Enter para voltar ao menu Gerenciador de Processos"
          read key
          Menugerenciador
      }
    
       matapid(){
          echo "Informe o PID do processo: "
          read processo
          echo "Matando processo..."
          kill -9 $processo
          sleep 2
          echo -n "Pressione Enter para voltar ao menu Gerenciador de Processos"
          read key
          Menugerenciador
      }

    
#######################Inicio do Texto#########################
     Texto(){
     DIALOG=${DIALOG=dialog}
tempfile=`tempfile 2>/dev/null` || tempfile=/tmp/test$$
trap "rm -f $tempfile" 0 1 2 5 15

cat << EOF > $tempfile

Seguem varios exemplos de Comandos utilizados no Gerenciamento
de Processos no Linux.

Coloquei exemplos e funcoes.

*Fonte: Resumi de varios sites. Principalmente do vivaolinux.com.br
*Ele nao segue nenhuma "norma"
*Nao sao utilizados acentos,pois a sintaxe nao permite.

************Comando ps******************

ps \E9 o comando que mostra os processos do sistema

op\E7\F5es:
ps - (process)lista processos
a - (all)mostra todos os processos criados.
u - (user) mostra nome do usuario e hora que foi iniciado.
x - (grafico) mostra processos que nao sao controlador pelo terminal.

#ps -aux

##vai listar as seguintes informa\E7\F5es por exemplo.
USER  PID  %CPU  %MEM  VSZ  RSS TTY  STAT  START  TIME  COMMAND
root   1    0.1   0.4  528   S   ?    S    11:34  0:04    init


USER - (User) Name
UID - (User Id) Number
PID - (Process Id)
RSS - Resultado da soma total de mem fisica usada pelo proc. em Kb
STAT - Estado do Processo S - Suspenso, R - em Execu\E7\E3o, T - Interrompido, Z Terminado, etc.
TTY - Terminal onde sao executados os processos
TIME - Tempo total da CPU usado pelo processo desde iniciado.
COMMAND - Nome do Comando do processo.

exemplo para um processo em especifico

#ps aux | grep cron
root 347 0.0 0.3 1654 680 ? S 09:00 0:00 /usr/sbin/cron


*********Comando pstree***********
o Comando pstree e usado para visualizar a arvore de processos

#pstree
init-+-alarmd
|-apache----5*[apache]
|-atd
|-cron
|-6*[getty]
|-i2oevtd
|-inetd

********Comando top**************
O comando top e o gerenciador de processos do Linux/Unix
Opcoes de Sintaxe:

-d [tempo] # Atualiza a tela ap\F3s o tempo especificado.
-s # Executa o top em modo seguro
-i # Executa o top ignorando processos zumbis
-c # Mostra a linha de comando ao inv\E9s do nome do programa

Opcoes de operacoo
espaco - atualiza a tela
i -ignora processos ociosos
k -mata um processo
N -Classifica os processos por numero de PID
A -Classifica os processos por per\EDodo.
P -(Process)Classifica os processos por uso do CPU
M -(Memory)Classifica os processos por uso de mem.
T -(Time)Classifica os processos por Tempo
u -Mostra os processos de um usuario espec\EDfico
n ou # -Lista um numero de processos
r -restart TOP
q -Sai do TOP

***********Comando kill******************
Mata,para,executa o processo identificado por seu PID(Process ID)
#pgrep cron
347

O PID da cron \E9 o 347,entao se o objetivo e mata-lo...
#kill -9 347

Se o objetivo for apenas parar o processo...
#kill -19 347
#ps lax | grep cron                T means que o processo esta Interrompido.
140 0 130002 1 9 0 1996 708 signal T ? 0:00 /usr/bin/...

Se agora queremos colocar em execucao o processo interrompido...
#kill -18 347
#ps lax | grep cron                S processo voltou ao estado Execucao
140 0 130002 1 9 0 1996 708 signal S ? 0:00 /usr/bin/...

************Comando killall**************
Como o nome diz,mata tudo! Atraves do nome e nao do id.

#ps aux | grep cron
lista processo1 da cron
lista processo2 da cron

Ao inves de utilizar o ID de cada processo apenas matamos todos pelo nome.
#killall -9 cron

Com outras variacoes
killall -u loja


**************nice**********************

O comando nice atribui um numero de prioridade para um processo. Por default os processos de usuarios sao criados com prioridade 0. Nos podemos definir as prioridades oscilando entre +19 e -19, os numeros positivos indicam processos de baixa prioridade e os numeros negativos indicam processos de alta prioridade.

nice -n [numero da prioridade] [comando/programa]

Vamos inicializar o vi com um nivel de prioridade baixa, veja o exemplo:

# nice -n 19 vi
# ps -lax | grep vi
000     0  1072  1014  19  19  8504 3560 do_sel SN   pts/1      0:00 vi

Observe que a prioridade de processamento do vi agora \E9 baixa, podemos utilizar o top para verificar a prioridade, veja o exemplo:

# top -d3 (Quando o programa iniciar pressione "T")
5:21pm  up  1:09,  4 users,  load average: 0,47, 0,32, 0,36
49 processes: 48 sleeping, 1 running, 0 zombie, 0 stopped
CPU states:  4,1% user,  2,2% system,  0,0% nice, 93,5% idle
Mem:   118964K av,  115336K used,    3628K free,       0K shrd,   42304K buff
50480K actv,       0K in_d,       0K in_c,       0K target
Swap:  100760K av,   22100K used,   78660K free                   22012K cached

PID USER     PRI  NI  SIZE  RSS SHARE STAT %CPU %MEM   TIME COMMAND
1087 root      18   0  1060 1060   848 R     3,5  0,8   0:00 top
1072 root      19  19  3560 3560  2584 S N   0,0  2,9   0:00 vi
679 root       9   0  1124 1120   452 S     0,0  0,9   0:00 klogd


********************Comando renice******************************
O renice \E9 um comando que altera a prioridade de um processo em execu\E7\E3o.

renice [numero da prioridade] [opcao] processo

Podemos usar as seguintes opcoes:

* -g - Faz com que o parametro seguinte seja interpretado como um IDs de grupos de processos.
* -u - Faz com que o parametro seguinte seja interpretado como um nome de usu\E1rio.
* -p - Faz com que o parametro seguinte seja interpretado como um ID de processo.

Agora vamos mudar a prioridade do vi para -19, com o processo em execucao.
Primeiro precisamos saber o numero do processo, para isso podemos usar o comando pgrep, veja o exemplo:

# pgrep vi
1072

# renice -19 -p 1072
1072: prioridade antiga = 19; prioridade nova = -19

Agora que mudamos a prioridade de execucao vamos verifica-la:

# ps -lax | grep vi
000     0  1072  1014   1 -19  8504 3560 do_sel S<   pts/1      0:00 vi

Observe agora que a prioridade do vi agora e alta.


EOF

$DIALOG --clear --title "Comandos" --textbox "$tempfile" 22 77

case $? in
  0)
    echo "OK"; Menugerenciador;;
  255)
    echo "ESC pressed."; Menugerenciador;;
esac

     }

############################Fim do Texto######################################  
 
#####***************Fim do Gerenciador de Processos********************#######


clear
############Inicio Saudacao Usuario#################
#Se quiser... Captura usuario Logado: `who | awk '{print $1;}' 


#Descobre qual a hora e classifica com resposta "Bom Dia,Boa Tarde ou Boa Noite"
Hora=$(date +%H)
case $Hora in

     0? | 1[01] ) echo -n "                  Bom Dia " ;;          

## Significa zero seguido de qualquer coisa(?),ou (|) um seguido de zero ou um ([01]) ou seja,esta linha pegou 01,02...10 e 11;
    
     1[2-7]     ) echo -n "                  Boa Tarde " ;; 

## Significa um seguido da lista de dois a sete,ou seja,esta linda 12,13 ... 17

     *          ) echo -n "                  Boa Noite " ;; 

## Significa que pega tudoo que não casou com padrões anteriores.

esac
sleep 2
echo " "
##########Inicio Helice doida###############
#PATH="/bin:/usr/bin:/usr/local/bin"

# I - Executa-se o comando desejado em background:
sleep 7 > /dev/null 2>&1 &
echo 
echo -e "                                                  \e[30;5;1m ##### \e[m"
echo -e " __       __   _____   ___     ______  ______    \e[30;5;1m ####### \e[m "
echo -e " ; \  _  / ;  ;  _  ;  ; |     | ____; | ____;   \e[30;5;1m ##\e[37mO\e[30m#\e[37mO\e[30m## \e[m"                     
echo -e "  \ \/ \/ /   | | | |  | |     | |__   | |__     \e[30;5;1m #\e[33m#####\e[30m# \e[m"
echo -e "   \  ^  /    | |_| |  | |__   |  __;  |  __;   \e[30;5;1m ##\e[37m#\e[33m###\e[37m#\e[30m## \e[m"
echo -e "    ;; ;;     ;_____;  |____;  |_|     |_|     \e[30;5;1m ##\e[37m#######\e[30m## \e[m"
echo -e "                                              \e[30;5;1m ##\e[37m#########\e[30m## \e[m"
echo -e "                   Scr1ptS                    \e[30;5;1m ##\e[37m#########\e[30m## \e[m "
echo -e "                                             \e[33;5;1m ##\e[30;5;1m#\e[37m#########\e[30m#\e[33;5;1m#\e[m "
echo -e "                                           \e[33;5;1m #####\e[30;5;1m#\e[37m#######\e[30m#\e[33;5;1m#####\e[m"
echo -e "                                           \e[33;5;1m ######\e[30;5;1m#\e[37m#####\e[30m#\e[33;5;1m######\e[m"
echo -e "                                           \e[33;5;1m   ####\e[30;5;1m######\e[33;5;1m####\e[m"
sleep 3

###Metodo que verifica/instala pacote
pacote=$(dpkg --get-selections | grep "dialog" ) 
echo 
echo
echo -n "Verificando se o Pacote Dialog esta instalado."
sleep 2
if [ -n "$pacote" ] ;
then echo
     echo "Pacote Dialog ja instalado"
else echo
     echo "Pacote Dialog Necessario-> Nao instalado"
     echo "Instalando Automaticamente Pacote Dialog..."
     sudo apt-get install dialog
fi

echo
# Funcao responsavel por implementar a helice:
mostraHelice() {
   # Cursor invisivel
   tput civis
   
   # II - Checar se o comando em background ainda esta em execucao:
   while [ -d /proc/$! ]
   do
      # III - Monta-se a helice:
      for i in / - \\ \|
      do
         # Posicionamento dos caracteres
         printf "\033[1D$i"
         # P.S.: O escape '\033[1D' move o cursor uma posicao para esquerda!
         sleep .1
      done
   done
   
   tput cnorm
}


# Resultado na tela
printf "\e[32;5;1mAguarde,iniciando... \e[m\040\040" ; mostraHelice
# Fim da barrinha louca

#########################Inicio das Telas############################


{
DIALOG=${DIALOG=dialog}

$DIALOG --title "Gerenciador SHELL Script Facvest" --clear \
        --yesno "Bem vindo ao Gerenciador SHELL Script!!! 
Esta é uma prévida de 1 dos módulos do meu TCC.\
Após apresenta-lo,em 2014 postarei todo o conteudo

Aluno: Jonathan Wolff Andrade         \

Curso: Ciencia da Computacao   \

Centro Universitario Univesc - FacVest - Lages - Turma 2010          \


\
Deseja iniciar?                   " 16 61

case $? in
  0) 
    Menugerenciador ;;
  1)
    exit ;;
  255)
    exit ;;
esac
}



