OVH Cloud OVH Cloud

crond : envoi de mail ou pas

13 réponses
Avatar
Zouplaz
Bonjour, je voudrais ne recevoir un mail de la sortie standard des
commandes exécutées par crond que pour certains d'entre elles.

En plus clair, j'ai plusieurs tâches cron et je reçois en mail
d'exécution pour toutes alors que seulement certaines d'entre elles
m'intéressent.

Est-ce qu'il y a une solution ?

Merci

10 réponses

1 2
Avatar
JustMe
Zouplaz a écrit
Bonjour, je voudrais ne recevoir un mail de la sortie standard des commandes
exécutées par crond que pour certains d'entre elles.

En plus clair, j'ai plusieurs tâches cron et je reçois en mail d'exécution
pour toutes alors que seulement certaines d'entre elles m'intéressent.

Est-ce qu'il y a une solution ?

Merci


Rediriger la sortie standard et stderr vers /dev/null pour celles qui
ne vous interessent pas

Avatar
Jacques Lav!gnotte (When you reply drop Dr NO)
Zouplaz a écrit
Bonjour, je voudrais ne recevoir un mail de la sortie standard des
commandes exécutées par crond que pour certains d'entre elles.


Rediriger la sortie standard et stderr vers /dev/null pour celles qui ne
vous interessent pas


*/10 * * * * /usr/local/sbin/auto-frmug 2>&1 1>/dev/null



Jacques


voir <http://linuxfr.org/tips/108.html>


Avatar
JustMe
Jacques Lav!gnotte (When you reply drop Dr NO) a écrit
Zouplaz a écrit
Bonjour, je voudrais ne recevoir un mail de la sortie standard des
commandes exécutées par crond que pour certains d'entre elles.


Rediriger la sortie standard et stderr vers /dev/null pour celles qui ne
vous interessent pas


*/10 * * * * /usr/local/sbin/auto-frmug 2>&1 1>/dev/null


Je dirai plutot :

*/10 * * * * (/usr/local/sbin/auto-frmug 2>&1) 1> /dev/null


En effet, au moins sur ma machine :

# (echo error >&2; echo stdout)
error
stdout

Normal

# (echo stderr >&2; echo stdout) 2> /dev/null
stdout
# (echo stderr >&2; echo stdout) > /dev/null
stderr

Normal aussi

Mais :

# (echo stderr >&2; echo stdout) 2>&1 > /dev/null
stderr

Et il faut :

((echo stderr >&2; echo stdout) 2>&1 ) > /dev/null

Pour ne rien avoir...



Avatar
Laurent
Je dirai plutot :

*/10 * * * * (/usr/local/sbin/auto-frmug 2>&1) 1> /dev/null


Je crois même avoir "mieux" :
*/10 * * * * /usr/local/sbin/auto-frmug 1>/dev/null 2>&1

(echo stderr >&2; echo stdout) >/dev/null 2>&1
ne donne rien chez moi...

Avatar
JustMe
Laurent a écrit
Je dirai plutot :

*/10 * * * * (/usr/local/sbin/auto-frmug 2>&1) 1> /dev/null


Je crois même avoir "mieux" :
*/10 * * * * /usr/local/sbin/auto-frmug 1>/dev/null 2>&1

(echo stderr >&2; echo stdout) >/dev/null 2>&1
ne donne rien chez moi...


Il faut mettre le "2>&1" apres la redirection principale ? Pas
intuitif, mais effectivement ca marche...

Quelle est l'explication ?

# (echo stderr >&2; echo stdout) > /dev/null 2>&1
=> rien

# (echo stderr >&2; echo stdout) 2>&1 > /dev/null
stderr


Avatar
Nicolas George
JustMe wrote in message :
Il faut mettre le "2>&1" apres la redirection principale ? Pas
intuitif, mais effectivement ca marche...

Quelle est l'explication ?


Quand il n'y a pas de pipe en jeu, les redirections sont faites dans l'ordre
où elles apparaissent. Donc :

foo 2>&1 >/dev/null

Avant redirection : 1 -> tty, 2 -> tty
Après 2>&1 : 1 -> tty, 2 -> tty (rien de changé)
Après >/dev/null : 1 -> null, 2 -> tty

foo >/dev/null 2>&1

Avant redirection : 1 -> tty, 2 -> tty
Après >/dev/null : 1 -> null, 2 -> tty
Après 2>&1 : 1 -> null, 2 -> null

# (echo stderr >&2; echo stdout) > /dev/null 2>&1


Les redirections pour le sous-shell sont évidemment faites avant celles du
sous-shell lui-même. Donc pour le sous-shell, 1 et 2 vont vers /dev/null, et
rien ne peut sortir.

# (echo stderr >&2; echo stdout) 2>&1 > /dev/null
stderr


Ici, pour le sous-shell, on a vu que 1 va vers /dev/null et 2 vers le tty.

Avatar
Laurent
Quelle est l'explication ?

# (echo stderr >&2; echo stdout) > /dev/null 2>&1
=> rien

# (echo stderr >&2; echo stdout) 2>&1 > /dev/null
stderr


"d'instinct", je dirais que c'est interprété linéairement, et que si tu
mets 2>&1 en premier, la sortie standard n'est pas encore redirigé vers
/dev/null à ce moment là...

Avatar
JustMe
Laurent a écrit
Quelle est l'explication ?

# (echo stderr >&2; echo stdout) > /dev/null 2>&1
=> rien

# (echo stderr >&2; echo stdout) 2>&1 > /dev/null
stderr


"d'instinct", je dirais que c'est interprété linéairement, et que si tu
mets 2>&1 en premier, la sortie standard n'est pas encore redirigé vers
/dev/null à ce moment là...


Ben oui, donc logiquement le > situé apres devrait s'appliquer aux
deux. Or ca fait le contraire (cf. exemple)


Avatar
JustMe
Nicolas George a écrit
JustMe wrote in message :
Il faut mettre le "2>&1" apres la redirection principale ? Pas
intuitif, mais effectivement ca marche...

Quelle est l'explication ?


Quand il n'y a pas de pipe en jeu, les redirections sont faites dans l'ordre
où elles apparaissent. Donc :

foo 2>&1 >/dev/null

Avant redirection : 1 -> tty, 2 -> tty
Après 2>&1 : 1 -> tty, 2 -> tty (rien de changé)


pourquoi "rien de changé" ? Normalement 2>&1 fusionne stdout et stderr,
non ?

Après >/dev/null : 1 -> null, 2 -> tty

foo >/dev/null 2>&1

Avant redirection : 1 -> tty, 2 -> tty
Après >/dev/null : 1 -> null, 2 -> tty
Après 2>&1 : 1 -> null, 2 -> null


là je suis pas...


# (echo stderr >&2; echo stdout) > /dev/null 2>&1


Les redirections pour le sous-shell sont évidemment faites avant celles du
sous-shell lui-même. Donc pour le sous-shell, 1 et 2 vont vers /dev/null, et
rien ne peut sortir.

# (echo stderr >&2; echo stdout) 2>&1 > /dev/null
stderr


Ici, pour le sous-shell, on a vu que 1 va vers /dev/null et 2 vers le tty.



Avatar
Nicolas George
JustMe wrote in message :
pourquoi "rien de changé" ? Normalement 2>&1 fusionne stdout et stderr,
non ?


Non, il n'y a pas de notion de « fusionner » pour des file descriptors.

Ce que tu as, en gros, c'est ceci :

+-------------+
| task_struct | _____
+-------------+ / _ __
| ... | / / | /
| fd 1 -+-' / v v / v
| | / +--------+ / +---------+
| fd 2 -+--' | file | / | inode |
| | +--------+ / +---------+
| | | ... | / | (136,5) |
+-------------+ | inode -+-' | |
| | +---------+
+--------+

(sous Linux, une structure file n'a pas un pointeur directement vers un
inode, mais un pointeur vers une dentry qui elle-même pointe vers l'inode,
mais on s'en fout

Quand on fait une redirection du type 2>&1, ça fait en interne un dup2(1,2),
ce qui veut dire : déconnecter le fd 2 de ce à quoi il était connecté,
décrémenter le compteur de références en conséquence, libérer les ressources
si nécessaire, puis connecter le fd 2 à la même chose que le fd 1,
incrémenter le compteur de référence en conséquence.

Quand les fd 1 et 2 pointaient déjà sur la même chose, ça revient
essentiellement à ne rien changer.

Bien sûr, après une telle redirection (et avant aussi, puisque ça n'a rien
changé), tout ce qui travaille avec les structures file traitent les fd 1 et
2 comme exactement la même chose. Mais pas les appels système qui
travaillent au niveau du file descriptor, ce qui est justement le cas des
appels système mis en jeu par les redirections.

1 2