Une revue de journaux le matin ou un contrôle d’état de service n’a pas besoin d’une conversation. claude -p exécute une demande, imprime la réponse et rend la main avec un code de sortie, comme toute commande.
Le principe
-p (ou --print) lance Claude Code sans interface interactive. La commande lit l’entrée standard : on lui passe des données par un tube et on redirige la réponse. L’entrée pipée est plafonnée à 10 Mo.
tail -n 500 /var/log/<service>.log | claude -p "Résume les erreurs de ce journal, classées par gravité" > resume.txt
Une sortie exploitable par un script
--output-format accepte text (défaut), json et stream-json. En json, la réponse est dans le champ result, avec session_id et des métadonnées. Pour imposer une forme, --json-schema prend un schéma JSON et la réponse arrive dans structured_output.
claude -p "Liste les services en échec cités dans ce journal" \
--output-format json \
--json-schema '{"type":"object","properties":{"services":{"type":"array","items":{"type":"string"}}},"required":["services"]}' \
< journal.txt | jq '.structured_output.services'
Restreindre à la lecture
Une tâche d’exploitation planifiée ne doit rien modifier. Trois options se combinent :
--toolsrestreint les outils intégrés ;--tools ""les retire tous, ce qui suffit quand les données arrivent par le tube. Les outils MCP ne sont pas concernés :--disallowedTools "mcp__*"les retire.--allowedToolsliste ce qui s’exécute sans confirmation.Bash(systemctl status *)couvre toute commande qui commence parsystemctl status; l’espace avant*compte.--permission-mode dontAsk(déjà présenté ici) refuse tout appel qui aurait demandé confirmation. Restent permis les lectures dans les répertoires de travail, les commandes reconnues en lecture seule (ls,cat,grep, formes en lecture degit…) et ce que couvre--allowedTools.
Fixez le mode explicitement : selon la configuration, un run -p peut démarrer en default ou en auto (voir les modes).
claude -p "Vérifie l'état du service <service> et résume les anomalies" \
--permission-mode dontAsk \
--allowedTools "Bash(systemctl status *)" \
--max-turns 5 --output-format json
--max-turns limite le nombre de tours agentiques. Aucune limite par défaut ; atteinte, elle fait sortir le run en erreur.
Tester le code de sortie
Claude Code sort avec 0 en cas de succès et un code non nul en cas d’échec. Une erreur pendant le run, comme une authentification manquante, est imprimée comme résultat sur stdout : on teste le code, pas seulement le fichier produit. Un arrêt par SIGTERM donne 143.
En --bare, Claude Code ne lit ni l’OAuth ni le trousseau : la clé vient de ANTHROPIC_API_KEY, ou d’un apiKeyHelper passé dans --settings. Sous cron, cette variable n’existe pas : le script la lit dans un fichier en mode 600, hors de tout dépôt. Jamais dans la crontab, jamais en dur.
#!/usr/bin/env bash
# revue-journaux.sh
set -u
export PATH="<dossier_de_claude>:/usr/bin:/bin"
export ANTHROPIC_API_KEY="$(cat "<fichier_cle_mode_600>")"
cd "$HOME/claude-revue" || exit 1 # répertoire dédié, sans .claude/
tail -n 500 /var/log/<service>.log \
| claude --bare -p "Résume les erreurs de ce journal, classées par gravité" \
--tools "" --output-format json > "$HOME/rapports/revue.json"
code=$?
if [ "$code" -ne 0 ]; then
echo "revue-journaux : claude -p a échoué (code $code)" >&2
exit "$code"
fi
jq -r '.result' "$HOME/rapports/revue.json"
Le planifier
Sous Linux, une ligne de crontab : minute, heure, jour du mois, mois, jour de semaine, puis la commande, exécutée par /bin/sh. Cron ne fixe que SHELL, HOME et LOGNAME : d’où le PATH posé en tête du script. Un % non échappé dans la commande devient un saut de ligne.
# revue quotidienne des journaux à 06h30
30 6 * * * $HOME/bin/revue-journaux.sh >> $HOME/rapports/revue.log 2>&1
Sous Windows, une tâche nommée, visible dans le Planificateur, qui lance un script PowerShell signé, installé en local, sans toucher à la politique d’exécution. Sans /ru, elle tourne avec les droits de l’utilisateur courant, et /rl vaut LIMITED par défaut. -NonInteractive est prévu pour les tâches planifiées ; avec -File, un exit <n> du script devient le code de sortie du processus.
schtasks /create /tn "Claude - revue journaux" /sc daily /st 06:30 /tr "powershell.exe -NoProfile -NonInteractive -File <dossier_local>\revue-journaux.ps1"
schtasks /query /tn "Claude - revue journaux" /fo LIST /v
La vue détaillée affiche notamment un champ Last Result.
Ce qu’il faut retenir
claude -plit stdin, répond et sort ; enjson, la réponse est dansresult, avec--json-schemadansstructured_output.- Lecture seule :
--toolsretire les outils,dontAskrefuse ce qui demanderait confirmation,--allowedToolsouvre l’exact nécessaire. --max-turnsn’a pas de défaut : fixez-le.- En tâche planifiée :
--baredepuis un répertoire dédié,PATHexplicite, clé lue dans un fichier protégé. - Testez le code de sortie : une erreur pendant le run arrive sur stdout.
In English
claude -p runs a request without an interactive session. JSON output, restricted tools, capped turns and a tested exit code: what it takes to plug it cleanly into cron or Task Scheduler. –max-turns has no default limit, the dontAsk mode refuses anything that would require confirmation, and without –bare a -p run executes the project's hooks and MCP servers without a trust dialog.
Sources & vérification
Relevé sur : Documentation Claude Code, relevé 2026-10
- Claude Code, Run Claude Code programmatically code.claude.com
- Claude Code, CLI reference code.claude.com
- Claude Code, Choose a permission mode code.claude.com
- Claude Code, Configure permissions code.claude.com
- Microsoft Learn, schtasks create learn.microsoft.com
- Microsoft Learn, schtasks query learn.microsoft.com
- man7.org, crontab(5) man7.org
- Microsoft Learn, about_PowerShell_exe learn.microsoft.com
