É possível determinar se um job está sendo iniciado como um job at (ativado pelo atd / cron)?

3

Existe uma maneira de identificar se um script está sendo executado como um trabalho em vez de interativamente do shell por um usuário?

Alguns de nossos scripts têm um protetor para verificar se estão sendo exibidos na tela, verificando $ TERM. Estou tentando descobrir se posso verificar inteligentemente como a execução do script foi iniciada para que eu possa atualizar essa declaração de proteção OU se devo adicionar uma opção que sempre deve ser incluída quando executada em um trabalho.

    
por cclark 04.12.2014 / 03:06

3 respostas

1

Você pode verificar o nome do processo pai usando a variável de ambiente $ {PPID} e procurando por isso em ps.

    
por 04.12.2014 / 03:46
0

Habilite o registro para os subsistemas de execução de tarefas. Mais especificamente, cron e at irão logar ao syslog por padrão, então você precisa apenas garantir que os eventos registrados sejam persistidos. Você pode querer adicionar o seguinte ao seu /etc/syslog.conf

## Log cron and at to /var/adm/scheduled.log
cron.*  /var/adm/scheduled.log 

Depois de adicionar isso, reinicialize o daemon syslog para fazer com que ele escolha os parâmetros de configuração recém-adicionados. Nesse ponto, você tem um registro dos trabalhos planejados que foram executados e pode comparar um trabalho com o registro de sua execução. [1]

Para verificar as agendas de todos os usuários em um determinado momento, convém fazer o seguinte, que listaria seus trabalhos no relatório em / tmp / schedulereport

unlink /tmp/schedulereport ;
cat /etc/passwd |while read ROW ; do 
  LOGIN="$(echo ${ROW} |cut -d: -f1)" ; 
  SHELL="$(echo ${ROW} |cut -d: -f7)" ; 
  [[ "${SHELL}" == '/sbin/nologin' && "${SHELL}" == '/bin/false' ]] \
    && ATJOBS='Skipping AT queue for non-interactive user' \
    || ATJOBS="$(su - ${LOGIN} -c 'atq' 2>/dev/null)" ; 
  [[ "${SHELL}" == '/sbin/nologin' && "${SHELL}" == '/bin/false' ]] \
    && CRONJOBS='Skipping CRON queue for non-interactive user' \
    || CRONJOBS="$(su - ${LOGIN} -c 'crontab -l' 2>/dev/null)"  ; 
  echo -e "${LOGIN}:\nAT:\n${ATJOBS}\n\nCRON:\n${CRONJOBS}\n\n=====\n >>/tmp/schedulereport " ; 
  ATJOBS='' ;
  CRONJOBS='' ;
done

Claro, se você estiver querendo impedir que usuários não autorizados agendem trabalhos, você pode adicionar somente os usuários autorizados a "cron.allow" e "at.allow" e todos os usuários não listados não poderão ser executados os comandos "crontab" ou "at" ou "batch".

1: Note que a estrela significa o registro em nível de depuração, que pode ficar muito detalhado. Se os logs forem preenchidos com informações não acionáveis, talvez você queira substituir o "*" por "info"

    
por 04.12.2014 / 06:05
0

Outra opção é usar pstree

$ pstree -lp | grep crond
        |-crond(2059)-+-crond(4445)---sh(4452)
        |             '-crond(4446)---sh(4453)

Nesse caso, o PID 4452 e o 4453 são scripts que foram iniciados via crond.

    
por 19.05.2015 / 12:51

Tags