Você pode verificar o nome do processo pai usando a variável de ambiente $ {PPID} e procurando por isso em ps.
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.
Você pode verificar o nome do processo pai usando a variável de ambiente $ {PPID} e procurando por isso em ps.
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"
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.