Ainda não há saída de redirecionamento em uma tarefa cron

1

Todas as respostas para a pergunta de por que um trabalho cron resulta em um arquivo de tamanho zero se resume a usar o redirecionamento de saída clássico. Isso ainda não ajuda aqui.

# cat /etc/cron.d/aide
SHELL=/bin/bash
48 22 * * * root /usr/sbin/aide --check >/var/log/dailys/aide-$( date +\%Y\%m\%d ).out 2>&1

Eu só receberei um arquivo de tamanho zero. Se eu puxar esse comando e executá-lo no prompt do bash (soltando as barras invertidas), recebo um arquivo preenchido.

UPDATE 1

@rudimeier sugeriu o uso de strace para rastrear meus descritores de arquivo. Isso falhou, mas de maneiras interessantes.

# cat /etc/cron.d/aide
SHELL=/bin/bash
21 13 * * * root strace /usr/sbin/aide --check >/var/log/dailys/aide-$( date +\%Y\%m\%d ).out 2>/var/log/dailys/strace.out

A tarefa foi executada, aide foi executada sem saída e strace mostrou-me que as designações do descritor de arquivo começaram com 3. A única referência a /var/log/dailys foi quando aide verificou as permissões e o conteúdo dos arquivos no diretório. Então, eu tentei outra coisa: vamos lançar o cron job, e olhar os vários descritores de arquivos de processos. Acabei tendo que ser um pouco rápido para fazer tudo isso, e ter esse truque no meu bolso me deu mais pistas para o acompanhamento.

# ps -ef | grep aide
root 27794 27792 <stuff> /bin/bash -c /usr/sbin/aide --check > /var/log/dailys/aide-$( date +%Y%m%d ).out 2>&1
root 27795 27794 <stuff> /usr/sbin/aide --check

# ls -l /proc/27794/fd
lr-x------. <stuff> 0 -> pipe:[14123645]
l-wx------. <stuff> 1 -> pipe:[14123646]
l-wx------. <stuff> 2 -> pipe:[14123646]

# ls -l /proc/27795/fd
lr-x------. <stuff> 0 -> pipe:[14123645]
lrwx------. <stuff> 1 -> /null
lrwx------. <stuff> 2 -> /null
<stuff>

# ls -l /proc/27792/fd
lrwx------. <stuff> 0 -> /dev/null
lrwx------. <stuff> 1 -> /dev/null
lrwx------. <stuff> 2 -> /dev/null
lr-x------. <stuff> 5 -> anon_inode:inotify
lr-x------. <stuff> 6 -> pipe:[14123646]

# ps -ef | grep 27792
root 27792  3850 <stuff> CROND
<stuff>

# ps -ef | grep 3850
root  3850     1 <stuff> crond
<stuff>

Assim, o STDOUT e o STDERR do processo de ajuda estão sendo direcionados para /null , o pai bash shell está gravando para seu pai. Esse processo principal, CROND , não possui FDs graváveis. E não vejo qual processo pode ter criado /var/log/dailys/aide-20170803.out como um arquivo vazio para começar. Mais curioso e mais curioso ...

ATUALIZAÇÃO 2

Tudo começou com DISA STIG RHEL-07-020030 , que possui /usr/sbin/aide --check 2>&1 | /bin/mail ... Eu já testei isso e sei que funciona. Por que canalizar e não redirecionar a saída?

Voltei para a versão pipe-mail e digitalizei PIDs e FDs. Com o arranjo de pipe bash, aide realmente preenche FD 1 e FD2 através do pipe, em vez de voltar para seu pai. Então, vamos brincar um pouco ...

# cat /etc/cron.d/aide
SHELL=/bin/bash
41 14 * * * root /usr/sbin/aide --check | tee /var/log/dailys/aide-$( date +%\Y\%m\%d ).out 1>/dev/null 2>&1

E isso funciona ... Eu tenho uma sensação fraca de que aide tem código que bloqueia o redirecionamento de saída além de um pipe. Vou escrever a solução quando minhas 24 horas terminarem.

    
por dafydd 03.08.2017 / 20:23

1 resposta

0

Você está usando o selinux. Se você "setenforce 0" e, em seguida, deixar cron executar, você receberá a saída esperada. No shell de root, o contexto do seu selinux é:

unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

Mas ao executar a partir do Cron, seu contexto de selinux começa como:

system_u:system_r:system_cronjob_t:s0-s0:c0.c1023

| para outro comando funciona, então você também pode ter feito | cat > file

O

auxiliar faz o seu próprio trabalho com o selinux, o que faz com que o redirecionamento falhe.

    
por 28.09.2017 / 20:23