10 votes

Les processus "cron" s'accumulent

J'ai des cronjobs qui font diverses tâches de nettoyage :

$ crontab -l
0 * * * * find ${HOME}/Downloads -depth 1 -d -mtime +12h -exec /usr/local/bin/trash {} \;
* * * * * /usr/bin/defaults delete com.apple.Spotlight userHasMovedWindow > /dev/null
* * * * * /usr/bin/defaults delete com.apple.Spotlight windowHeight > /dev/null

Cependant, il semble que les travaux, pour une raison quelconque, ne se terminent jamais. Au lieu de cela, ils s'attardent et s'affichent comme (cron) accompagné soit par (find) ou (defaults) dans la sortie de ps et dans le moniteur d'activité.

Cela se produit pour tous les emplois.

Au bout de quelques heures ou de quelques jours, l'ordinateur se fige car le système d'exploitation ne permet plus la création de processus.

$ sw_vers 
ProductName:    Mac OS X
ProductVersion: 10.15
BuildVersion:   19A583

5voto

Thomas Jensen Points 280

Rediriger stderr à /dev/null ainsi que stdout :

* * * * * /usr/bin/defaults delete com.apple.Spotlight userHasMovedWindow &> /dev/null
* * * * * /usr/bin/defaults delete com.apple.Spotlight windowHeight &> /dev/null

D'après des essais et des erreurs, il semble que ce soit le stderr de ces commandes qui empêche le cronjob de se terminer. Je n'ai aucune idée de la raison pour laquelle c'est le cas, mais cela peut être lié aux permissions d'envoyer la sortie.

1voto

rbanffy Points 159

Le moyen traditionnel sous UNIX d'empêcher l'exécution de plusieurs copies d'un programme est le fichier .pid (ou lock). L'exemple suivant apparaît à plusieurs endroits :

#!/bin/sh

NAME=$(basename "$0")

if [ -f /var/run/"$NAME.pid" ] &&
  ps -p $(cat /var/run/"$NAME.pid") >/dev/null 2>&1
then
   echo "Script is currently in progress... aborting..."
   exit 3
fi

# Remove the .pid file on exit (by setting a trap)
trap 'rm -f /var/run/"$NAME.pid"' EXIT

# Echoes the current PID to the .pid file
echo $$ > /var/run/"$NAME.pid"

L'inconvénient est que vous devrez déplacer vos commandes dans des fichiers script.

Avertissement : vous devez toujours comprendre pourquoi les programmes ne se terminent pas comme ils le devraient, mais cela vous permet, au moins, de ne pas surcharger votre système. Vous pouvez également choisir de tuer le PID incriminé au lieu de quitter le script nouvellement lancé.

0voto

Oskar Points 1242

Avez-vous accordé un accès complet au disque à votre exécutable cron ?

Les préférences système doivent permettre à cette tâche d'écrire et de lire pour la plupart des cas d'utilisation. Je redémarrerais, puis je ferais ce changement et je regarderais.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X