web-dev-qa-db-fra.com

printf, redirection, crontab

J'ai du mal à rediriger les instructions C printf vers un fichier avec un programme exécuté en tant que root.

J'ai un programme avec plusieurs instructions printf informatives et d'autres bibliothèques qui impriment des erreurs via stderr. Je voudrais les enregistrer dans un fichier. Si je démarre le programme à partir de la ligne de commande, je peux voir les messages stderr et stdout.

Sudo ./myprogram

Si j'essaye de rediriger comme ça,

Sudo ./myprogram >> log_file 2>&1

Le fichier_log contient uniquement stderr, et stdout disparaît.

Je soupçonne que le problème est lié au fait que l'utilisateur root n'est pas connecté à stdout, mais je n'ai pas trouvé de solution.

Mon but ultime est d'exécuter ce programme au démarrage du système en tant que root, tout en enregistrant stderr et stdout dans un fichier log_file.
J'ai essayé ceci en utilisant crontab,

 Sudo crontab -e

et en ajoutant la ligne,

@reboot bin/myprogram >> log_file 2>&1

Cela génère des messages stderr mais stdout disparaît, comme la ligne de commande.

Toute aide est la bienvenue, merci!

Modifications et mises à jour: Test ce matin, la redirection se comporte de la même manière sans Sudo. Une instruction printf typique ressemble à ceci:

printf("info: passed safety check\n");

J'utilise une configuration par défaut pour Ubuntu 14.04 sur un processeur ARM, donc je crois que j'utilise bash. J'ai confirmé avec,

echo $Shell

produit

/bin/bash
1
user2977486

Le comportement de printf() semble dépendre de l'emplacement de stdout.

  1. Si stdout est envoyé à la console, printf() est mis en mémoire tampon de ligne et est vidé après l'impression d'une nouvelle ligne.
  2. Si stdout est redirigé vers un fichier, le tampon n'est pas vidé à moins que fflush() soit appelé.
  3. De plus, si printf() est utilisé avant que stdout soit redirigé vers le fichier, les écritures suivantes (dans le fichier) sont mises en mémoire tampon et sont vidées après la nouvelle ligne.

Source: Pourquoi stdout a-t-il besoin d'un vidage explicite lorsqu'il est redirigé vers un fichier?

Je ne connais pas bien la programmation C, mais apparemment, vous devez ajouter fflush(stdout); après chaque instruction printf. Essayez-le depuis la ligne de commande. Si cela fonctionne, cela devrait fonctionner avec cron.

Plus de questions sur ce sujet:

1
Alaa Ali

Le TLDP HowTo a cette syntaxe Nice pour la redirection de stdout et stderr:

  @reboot /path/to/program &> /path/to/log

Le HowTo dit qu'il convient parfois aux entrées cron.

0
muru