com um shell script, é possível dizer quando é executado com o cron vs run manualmente?

5

com um shell script, é possível dizer quando é executado com o cron vs run manualmente?

ATUALIZAÇÃO:

foi perguntado por que eu quero saber. Meu trabalho do cron será log, e eu quero ser capaz de log se alguém está executando-o manualmente.

    
por Roy Rico 05.08.2010 / 00:02

4 respostas

8

Nos momentos em que precisei fazer isso, sei que é um script que nunca redirecionarei para um arquivo ou para um canal. Portanto, um teste simples é verificar se o stdout (a.k.a file descriptor 1) é um tty (que não será do cron). No bash:

if [ -t 1 ]
then
    : # running from terminal
else
    : # not running from terminal, cron maybe
fi

Mais uma vez, warning , este é um teste simplesmente se a sua stdout for tty. Mas funciona para os meus propósitos simples.

Você também pode verificar qual é o seu processo pai. No Linux, pode ser tão simples quanto:

if grep -q cron /proc/$PPID/cmdline &> /dev/null
then
    : # running from cron
fi
    
por 05.08.2010 / 00:10
5

Você pode definir uma variável de ambiente exclusiva no seu crontab:

RUNNINGFROMCRON=1

16 18 * * *     /usr/local/bin/crontest

Eu testei com este script:

#! /bin/bash

echo " running script "

echo -n "testing for var: "
echo $RUNNINGFROMCRON

Quando eu corri de cron , a saída foi:

running script 
testing for var: 1

Quando eu corri da linha de comando manualmente, a saída era:

running script 
testing for var:
    
por 05.08.2010 / 00:18
1

Você pode inspecionar o nome do processo pai, que pode ser recuperado com ps -p $PPID -o comm= . Isso é spoofable, é claro.

No entanto, isso não é necessariamente uma boa ideia (por exemplo, você não poderá testar com facilidade seus trabalhos agendados manualmente). Talvez se você explicar por que você quer isso, alguém pode sugerir uma solução melhor.

    
por 05.08.2010 / 00:15
0

Você pode criar um usuário especial para a execução da tarefa cron. Em seguida, faça seu script de maneira legível apenas pelo usuário e coloque-o no crontab do usuário. Dessa forma, nenhum outro usuário pode ler o script, muito menos executá-lo.

BTW, para uma solução segura, você precisa tornar o script do cron ilegível de qualquer maneira. Se outros usuários puderem ler o script, eles poderão copiá-lo, remover qualquer mecanismo de verificação de cron e executá-lo, contornando seu log se quiser.

    
por 05.08.2010 / 00:31