Como você mata um processo em execução em um bashscript sem matar o script?
Como você mata um processo em execução em um script bash sem matar o script?
Meta
Então ... eu preciso matar um processo em execução para continuar com a execução do meu script.
Aqui está uma versão simplificada do meu script:
# Setup
echo "Use ctrl+C to stop gathering data..."
./logger
#------------------
echo "Rest..."
Preciso ser capaz de matar ./logger sem matar meu script
Resultados esperados vs. reais
Eu esperava um resultado como este:
Use ctrl+C to stop gathering data...
^C
Rest...
mas para quando mato o programa
use ctrl+C to stop gathering data...
^C
O ./loggercomando é um programa C que já manipula o SIGINTsinal ( Ctrl + C), mas não para até recebê-lo. Existe uma maneira de parar o programa sem matar meu script?
O programa C não é importante, mas se parece com isso
#include <stdio.h>
#include <signal.h>
int flag = 1;
void handler(int i)
{
flag = 0;
}
int main(int argc, char** argv)
{
signal(SIGINT, handler);
while(flag)
{
usleep(10000);
}
}
Respostas
Se você digitar control-C no terminal onde o script está sendo executado, o sinal vai para todos os processos - o programa logger e o script. E o script termina porque você não disse a ele para ignorar os sinais enquanto o logger é executado. Você pode fazer isso usando o trapcomando, mas precisará desfazer o trapping antes de executar o programa C. Consulte também o manual do Bash sobre sinais .
Por exemplo, tenho um programa dribblerque gera mensagens, uma a cada segundo por padrão, mas é configurável. Estou usando-o como um substituto para o seu ./loggerprograma. As -mopções especificam a mensagem; a -nopção solicita que as mensagens sejam numeradas e a -topção especifica a saída para a saída padrão (em vez de um arquivo no qual grava por padrão).
#!/bin/bash
#
# SO 6418-0134
program="dribbler -t -n -m Hello"
echo "About to run '$program' command" trap "" 2 (trap 2; $program)
echo "Continuing after '$program' exits"
sleep 1
echo "But not for long"
O sub-shell é necessário. Quando executo esse script ( trapper.sh), obtenho, por exemplo:
$ bash trapper.sh
About to run 'dribbler -t -n -m Hello' command
0: Hello
1: Hello
2: Hello
3: Hello
^CContinuing after 'dribbler -t -n -m Hello' exits
But not for long
$
A propósito, POSIX define um comando loggerque grava mensagens usando a syslog()(s) função (ões) para o syslogdaemon.
Também pode valer a pena revisar as perguntas e respostas sobre como enviar SIGINT para o processo executivo bifurcado que executa um script não o mata , especialmente a resposta aceita e seus links para perguntas e respostas em outros sites do Stack Exchange, pois é importante que você e eu executemos um C programa, não um script de shell.