sleep comando não está fazendo o que é suposto fazer? [fechadas]

0

Estou fazendo um script bash onde eu tenho que esperar por alguns segundos (max 10), em seguida, executar alguns comandos. Isso ocorre porque, quando um programa é iniciado, ele também inicia alguns subprocessos inúteis dos quais não preciso. Mas como eu disse, demora alguns segundos para que isso comece, então o que eu fiz foi isso:

here is where the program is started && sleep 20 && kill 'ps -x | grep explorer.ex[e] | awk '{print $1}'' && kill 'ps -x | grep winewrapper.ex[e] | awk '{print $1}''

Mas depois que o sleep acabou de ser interrompido, ele não executa os comandos kill e, em vez disso, eu tenho que executá-los manualmente, eliminando o ponto desse script. O que eu deveria fazer? Estou usando o comando sleep errado?

EDIT: Uma vez que esta pergunta está sendo solicitada para ser encerrada, eu gostaria de esclarecer.

O processo sleep não é ativado e os comandos pkill não são executados. Aqui está o meu script inteiro (é o AppleScript, mas estou executando scripts unix do AppleScript):

do shell script "killall applet && cd /Applications/Dishonored.app/Contents/Resources/Dishonored/Binaries/Win32 && /Applications/CrossOver.app/Contents/SharedSupport/CrossOver/bin/wine --bottle ny\ flaska\ 2 Dishonored.exe && sleep 20 && kill 'ps -x | grep explorer.ex[e] | awk '{print $1}'' && kill 'ps -x | grep winewrapper.ex[e] | awk '{print $1}''"

O que posso fazer para que sleep acorde e continue com os comandos pkill após 20 segundos?

    
por DisplayName 14.02.2015 / 22:01

1 resposta

3

Não está claro o que você está perguntando, mas vejo várias possíveis fontes de problemas aqui.

Vamos deixar seus complicados comandos kill fora do caminho. Este não é o problema real, mas tornará o resto da resposta - e sua eventual solução - mais clara se você mudar para pkill . Ele faz a mesma coisa que seu pipeline ps + grep + awk + kill em um único comando. Não só é mais eficiente e fácil de digitar, como também não requer nenhum truque de regex para filtrar o comando grep dos resultados ps , o que é um erro comum que faz com que o pipeline seja quebrado antecipadamente, deixando processos correndo que deveria ser morto. Seu padrão grep evita esse erro, mas é fácil esquecer a necessidade. Eu vejo pela sua pergunta que você está no OS X, então você faz tem pkill . Você precisa coincidir com argumentos para o comando em vez de no nome do processo, mas você pode fazer isso com o sinalizador -f .

Com isso fora do caminho, a primeira fonte provável de seu problema é que seu comando inicial pode estar saindo com um código de erro. Como você está usando o operador && , os comandos subsequentes só serão executados se o primeiro retornar um código de saída 0, significando "nenhum erro". Se você quiser que esses comandos sejam executados independentemente, será necessário usar ; :

./myprogram ;
      sleep 20 &&
      pkill -f explorer.exe &&
      pkill -f winewrapper.exe

Observe que é possível misturar os dois estilos. Estamos dizendo: "Execute myprogram incondicionalmente, espere que ele saia e execute o resto dessas coisas, e todas elas devem retornar com êxito para continuar pela cadeia de comandos." sleep nunca falhará, mas se a primeira etapa pkill falhar e você quiser que a segunda seja executada, indique também a segunda && para ; .

A outra possibilidade é que você esteja esperando que estes comandos kill executem enquanto o Wine / CrossOver ainda estiver rodando Dishonored.exe . Ou seja, você quer que a matança comece 20 segundos depois que o Wine começar, não 20 segundos depois que ele sair. A menos que este programa se afaste em segundo plano, você obterá o último comportamento. Se você quer o comportamento paralelo, você precisa de fundo o primeiro programa:

./myprogram &
      sleep 20 &&
      pkill -f explorer.exe &&
      pkill -f winewrapper.exe

O & encerra o primeiro comando como ; no exemplo anterior, exceto pelo fato de o restante da cadeia de comando começar a ser executado assim que myprogram for iniciado.

    
por 14.02.2015 / 22:08