Aller au contenu
6 minutes

Claude Code sans session interactive : claude -p pour l’exploitation

claude -p exécute une demande sans session interactive. Sortie JSON, outils restreints, tours plafonnés et code de sortie testé : de quoi le brancher proprement dans cron ou le Planificateur.

Claude Code sans session interactive : claude -p pour l'exploitation

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 :

  • --tools restreint 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.
  • --allowedTools liste ce qui s’exécute sans confirmation. Bash(systemctl status *) couvre toute commande qui commence par systemctl 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 de git…) 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 -p lit stdin, répond et sort ; en json, la réponse est dans result, avec --json-schema dans structured_output.
  • Lecture seule : --tools retire les outils, dontAsk refuse ce qui demanderait confirmation, --allowedTools ouvre l’exact nécessaire.
  • --max-turns n’a pas de défaut : fixez-le.
  • En tâche planifiée : --bare depuis un répertoire dédié, PATH explicite, 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

Comment les billets sont vérifiés et corrigés