J'aimerais proposer une nouvelle réponse à cette question très votée. Cela ne fonctionne que sur les systèmes systemd avec loginctl
(par exemple, Ubuntu 14.10+, RHEL/CentOS 7+) mais est capable de donner une réponse beaucoup plus fiable que les solutions présentées précédemment.
service=$(loginctl --property=Service show-session $(</proc/self/sessionid))
if [[ ${service#*=} == 'crond' ]]; then
echo "running in cron"
fi
Pour résumer : lorsqu'il est utilisé avec systemd, crond
(comme sshd
et d'autres) crée une nouvelle session lorsqu'il lance un travail pour un utilisateur. Cette session possède un ID qui est unique pendant toute la durée de fonctionnement de la machine. Chaque session possède certaines propriétés, dont le nom du service qui l'a lancée. loginctl
peut nous indiquer la valeur de cette propriété, qui sera " crond
" si et seulement si la session a en fait été lancée par crond.
Avantages par rapport à l'utilisation de variables d'environnement :
- Il n'est pas nécessaire de modifier les entrées cron pour ajouter des invocations spéciales ou des variables d'environnement.
- Aucune possibilité qu'un processus intermédiaire modifie les variables d'environnement pour créer un faux positif ou un faux négatif.
Avantages par rapport au test pour tty :
- Pas de faux positifs dans les pipelines, les scripts de démarrage, etc.
Avantages par rapport à la vérification de l'arbre des processus :
- Pas de faux positifs provenant de processus qui ont également
crond
en leur nom
- Pas de faux négatifs si le script est désavoué.