Meu loop está parando, mas não posso descobrir por que -- and-line campo com bash camp askubuntu Relacionado O problema

My loop is stopping but cant figure out why


0
vote

problema

português

Aqui está a situação ... Eu tenho um programa que estou correndo no vinho. Este programa às vezes pendurará .. Eu queria criar um "script de monitoramento" para assistir e matar e reiniciá-lo se ele estiver trava. Eu consegui encontrar o processo e matá-lo se ele trava, mas o roteiro pára nesse ponto sem acabamento .. O acabamento seria dormir por 30 segundos, em seguida, lançar o programa novamente .. mas o script simplesmente pára < / p >.

Primeiro de tudo, vou dizer que sou muito ruim em escrever coisas assim ... Isso é de coisas de googling e batendo em um arquivo e tentando fazer isso para fazer o que eu quero: D

Aqui está o que eu tenho .. é um pouco desleixado e provavelmente pode ser limpo alguns ...

#!/bin/bash CPU_USAGE_THRESHOLD="120" TOPPROCESS="0" i="1" re='^[0-9]+([.][0-9]+)?$' while [ $i -eq 1 ]; do MYPROCESS=$(ps aux --sort=-pcpu | grep -v %CPU | head -n 1 | cut -d"." -f1 | cut -d" " -f7) MYPROCESS2=$(ps aux --sort=-pcpu | grep -v %CPU | head -n 1 | cut -d"." -f1 | cut -d" " -f6) if ! [[ $MYPROCESS2 =~ $re ]] ; then >&2; else if [ "$MYPROCESS2" -gt "1" ]; then TOPPROCESS="$MYPROCESS2" echo "the calculated top process2 is $TOPPROCESS" echo "the usage threshold is $CPU_USAGE_THRESHOLD"; fi fi if ! [[ $MYPROCESS =~ $re ]] ; then >&2; else if [ "$MYPROCESS" -gt "1" ]; then TOPPROCESS="$MYPROCESS" echo "the calculated top process is $TOPPROCESS" echo "the usage threshold is $CPU_USAGE_THRESHOLD"; fi fi if [ "$TOPPROCESS" -gt "$CPU_USAGE_THRESHOLD" ]; then exec pkill SAMBC.exe; echo "process killed" sleep 30 exec wine C:\SAMBC\SAMBC.exe sleep 60 i="1" else sleep 60 i="1" fi done

O resultado disso parece que ele pára em matar o processo ... Eu recebo isso como resultado se eu executar isso de um prompt de comando.

  {~}:$ monitorsam the calculated top process2 is 121 the usage threshold is 120 {~}:$    

Parece parar após a morte porque não é echo "process killed" A razão pela qual eu tenho processo e processo2 é por algum motivo o valor que eu preciso aparecerá em um ou outro .. Acho que depende do que é seu pid.

Como eu digo, sou muito ruim nessa coisa .. Eu realmente não entendo completamente o código que eu copiei fora das pesquisas do Google e encontramos os erros e corrigi-los usando o Google .. mas eu realmente realmente não Não entendo completamente. Apenas uma menor compreensão ... é provavelmente uma coisa semicolon ou algo que estou perdendo, mas eu tentei tudo o que posso pensar.

mata o processo quando ele trava .. mas não o inicia novamente e não continua a executar o script monitorsam ... Eu quero que ele reinicie o programa e continue a monitorá-lo para que ele possa matá-lo e Reinicie novamente se ele trava novamente.

lol desculpe pelo livro, mas eu queria ter certeza de que dei todas as informações que pude: D

Qualquer ajuda seria apreciada.

english

Here is the situation ... I have a program that I'm running in wine. This program will sometimes hang.. I wanted to create a 'monitoring script' to watch it and kill and restart it if it hangs. I have gotten it to find the process and kill it if it hangs but the script stops at that point without finishing .. the finishing would be to sleep for 30 seconds then launch the program again .. but instead .. the script just stops

First of all I will say that Im very bad at writing stuff like this ... this is from googling stuff and slapping it into a file and trying to get it to do what I want :D

Here is what I have .. its a bit sloppy and probably can be cleaned up some ...

#!/bin/bash  CPU_USAGE_THRESHOLD="120" TOPPROCESS="0" i="1" re='^[0-9]+([.][0-9]+)?$'  while [ $i -eq 1 ]; do          MYPROCESS=$(ps aux --sort=-pcpu | grep -v %CPU | head -n 1 | cut -d"." -f1 | cut -d" " -f7)          MYPROCESS2=$(ps aux --sort=-pcpu | grep -v %CPU | head -n 1 | cut -d"." -f1 | cut -d" " -f6) if ! [[ $MYPROCESS2 =~ $re ]] ; then           >&2;      else      if [ "$MYPROCESS2" -gt "1" ]; then         TOPPROCESS="$MYPROCESS2"         echo "the calculated top process2 is $TOPPROCESS"          echo "the usage threshold is $CPU_USAGE_THRESHOLD";      fi fi if ! [[ $MYPROCESS =~ $re ]] ; then           >&2;      else      if [ "$MYPROCESS" -gt "1" ]; then         TOPPROCESS="$MYPROCESS"         echo "the calculated top process is $TOPPROCESS"          echo "the usage threshold is $CPU_USAGE_THRESHOLD";       fi fi  if [ "$TOPPROCESS" -gt "$CPU_USAGE_THRESHOLD" ]; then      exec pkill SAMBC.exe;     echo "process killed"         sleep 30          exec wine C:\\SAMBC\\SAMBC.exe         sleep 60         i="1"  else     sleep 60     i="1"     fi done 

The result of this seems like it stops at killing the process... I get this as a result if i run this from a command prompt.

{~}:$ monitorsam the calculated top process2 is 121 the usage threshold is 120 {~}:$ 

It seems to stop after the kill because it doesn't echo "process killed" The reason I have process and process2 is for some reason the value I need will show up on one or the other .. I think it depends on what its PID is.

Like I say, I'm very bad at this stuff .. I don't really fully understand the code I just copied it off google searches and found the errors and corrected them using google .. but .. still really don't understand fully .. just a minor understanding ... it is probably some semicolon thing or something I'm missing but I tried all I can think of.

It kills the process when it hangs .. but doesn't start it again and doesn't continue to run the monitorsam script ... I want it to restart the program and continue to monitor it so it can kill it and restart it again if it hangs again.

lol sorry for the book but I wanted to make sure I gave all the information I could :D

any help would be appreciated.

     
         
         

Lista de respostas

3
 
vote
vote
Melhor resposta
 

Algumas coisas:

  • i é sempre 1 no seu script, afaict. Então não há sentido em usá-lo, e é mais simples fazer:

      while true; do ... done    
  • Você é exec ing pkill e wine .
    pkill SAMBC.exe e wine C:\SAMBC\SAMBC.exe . O comando ABCDEFGHIJKLMNABCDEFGHIJKLMN10 pode ser enviado para o fundo: ABCDEFGHIJKLMNABCDEFGHIJKLMN11 .

  • Se você deseja obter o uso da CPU de um processo específico, é mais fácil se você usar 12 para obter o PID e 13 para obter apenas a CPU Uso:

      14   

    O ABCDEFGHIJKLMNABCDEFGHIJKLMN15 Decimais para fora Decimais seguidos.

Combinando e simplificando:

  16   
 

A few things:

  • i is always 1 in your script, AFAICT. So there's no point in using it, and it's simpler to do:

    while true; do ... done 
  • You're execing pkill and wine. exec replaces the current shell with the command to be executed, so your script effectively ends when it exec's anything. Just do pkill SAMBC.exe and wine C:\\SAMBC\\SAMBC.exe. The wine command may need to be sent to the background: wine C:\\SAMBC\\SAMBC.exe &.

  • If you want to get the CPU usage of a specific process, it's easier if you use pgrep to get the PID and ps to get just the CPU usage:

    process_usage=$(ps -o pcpu= $(pgrep SAMBC.exe) | sed 's/\..*//') 

    The sed command strips away trailing decimals.

Combining and simplifying:

#!/bin/bash  CPU_USAGE_THRESHOLD="120"  while true; do     proc_usage=$(ps -o pcpu= $(pgrep SAMBC.exe) | sed 's/\..*//')      if (( proc_usage > CPU_USAGE_THRESHOLD )); then          pkill SAMBC.exe;         echo "process killed"         sleep 30          wine C:\\SAMBC\\SAMBC.exe &     fi     sleep 60 done 
 
 
 
 

Perguntas relacionadas

6  Minha função de bash é executada apenas uma vez por terminal aberta  ( My bash function runs only once per terminal opened ) 
Quando eu tento executar minha função bash, definida em .bashrc, por uma segunda vez no mesmo terminal, ela não funciona. O código é o seguinte: lspci6 ...

3  Directory Desktop não abrindo  ( Desktop directory not opening ) 
Eu sou completamente novo para o Ubuntu ou qualquer distribuição do Linux completamente. Ao usar o terminal, quando estou no diretório / home / username o c...

22  Bash Script não executando de Crontab [Duplicate]  ( Bash script not executing from crontab ) 
. Esta pergunta já tem respostas aqui : Por que os scripts crontab não estão funcionando? ...

0  Extrair linha do arquivo  ( Extract line from file ) 
Um arquivo que preciso extrair informações da aparência 2 41620 . T G 100 PASS AC=3;AF=0.000599042;AN=5008;NS=2504;DP=1887...

2  Por que meu script shell não está sendo executado? [fechado]  ( Why is my shell script not executing ) 
. fechado . Esta pergunta precisa detalhes ou clareza . Atualmente não está aceitando respostas. ...

9  Tirando linhas de "acesso negado"  ( Taking out access denied lines ) 
Quando eu uso find para ver todos os arquivos PDF no diretório /home , estou vendo access denied . Para eliminá-los, tentei: find /home -iname "*.pdf" ...

17  Por que preciso correr "/ bin / bash --login"  ( Why do i need to run bin bash login ) 
Acabei de configurar um novo servidor Ubuntu 13.10 com Ruby 2.1.1 instalado através de ABCDEFGHIJKLMNABCDEFGHIJKLMN1 . O problema é que, sempre que eu mude...

13  A maneira mais rápida de criar um arquivo de um terminal  ( The fastest way to create a file from a terminal ) 
Qual é a maneira mais simples de criar um arquivo usando uma linha de comando? Normalmente eu uso: touch filename Mas isso é o caminho mais simples / mais...

0  Como podemos evitar inserir o caminho de cada arquivo diferente a cada vez em um script shell?  ( How can we avoid entering the path of every different file each time in a shell ) 
Eu tenho que enviar um script para slurm. Devo inserir o caminho do diretório sempre que alterar o caminho do script de envio. Por exemplo, se estou em ABCDE...

3  Como definir a linguagem de resposta do SVN Info / Ligue de chamadas?  ( How to set svn info response call result language ) 
Eu localizei o Ubuntu Russo 11.10. Mas todos os meus scripts usam coisas como REMOTE_REV=`svn info $REMOTE_REPO | grep '^Revision:' | awk '{print $2}'` ...




© 2022 pergunte.org All Rights Reserved. Casa de perguntas e respostas todos os direitos reservados


Licensed under cc by-sa 3.0 with attribution required.