retrAIt Plan jouw dag ↗
Blog / Automatiseren met agents

Claude op vaste tijden aan het werk zetten

6 minuten lezenDelen

Een zwarte wekker op tafel in een streep zonlicht die door het raam valt
Foto Suhas Hanjar via Pexels
Het korte antwoord

Op je eigen server start een timer van systemd, of een regel in cron, op een vast moment een script. Dat script geeft Claude Code met claude -p één vaste opdracht en zo weinig rechten als mogelijk, en zet het antwoord in een bestand. Jij leest dat bestand en doet de laatste stap zelf.

Claude Code kan een taak doen zonder dat jij erbij zit. Daarvoor heb je drie dingen nodig: een commando dat Claude zonder gesprek laat werken, iets wat dat commando op een vast moment start, en een plek waar het resultaat terechtkomt zodat jij het kunt lezen. Op je eigen server zijn dat claude -p, een timer van systemd en een gewoon tekstbestand. Het belangrijkste ontwerpbesluit maak je vooraf: de taak bereidt iets voor, en jij doet de laatste stap. Hieronder werk ik dat uit met een voorbeeld, en ik ben eerlijk over wat het kost en waar het misgaat.

Het voorbeeld: een prijscontrole voor een fotograaf

Lotte is fotograaf. Het is een verzonnen voorbeeld. Haar prijzen staan op meerdere pagina’s van haar site, ook in de veelgestelde vragen. Elk jaar past ze haar prijslijst aan, en elk jaar blijft er ergens een oude prijs staan. Ze wil dat Claude op de eerste maandag van elke maand om 07.30 haar pagina’s vergelijkt met haar prijslijst en elk verschil noteert, met de pagina en de zin erbij. Aanpassen doet ze zelf. Een AI die zelf prijzen op haar site verandert, wil ze niet, en terecht.

Dit soort taak past goed bij automatiseren. Hij komt steeds terug en de invoer is duidelijk. Wat eruit komt, is een lijstje dat zij zelf leest, en als hij een keer mislukt, is er niets aan de hand. Waarom juist zulke taken geschikt zijn, staat in Wat is een AI-agent, en wat kun je er als ondernemer mee?

Claude zonder gesprek: claude -p

Met claude -p geef je Claude Code één opdracht. Hij doet zijn werk, geeft het antwoord en stopt. De p staat voor print. Je kunt tekst meegeven via de invoer, tot tien megabyte, en het antwoord naar een bestand sturen. Na afloop geeft het commando een getal terug, de exitcode: nul betekent dat het gelukt is, elk ander getal dat er iets misging. Daaraan ziet een script of een timer of de taak geslaagd is.

In Lottes script ziet de kern er zo uit. Het script heeft eerst haar prijslijst en de tekst van haar pagina’s in het bestand invoer.txt gezet:

claude -p "Vergelijk de prijzen op deze pagina's met mijn prijslijst. Noem elk verschil met de pagina en de zin. Verzin niets." \
  --permission-mode dontAsk --disallowedTools "*" --model sonnet \
  < invoer.txt > verschillen.txt

De opties achter de opdracht zijn de belangrijkste regels van de taak. Er zit niemand bij om toestemming te geven, dus je zegt vooraf wat Claude mag. Met --permission-mode dontAsk wordt alles geweigerd waarvoor Claude normaal toestemming zou vragen. Zet die stand altijd zelf. Doe je dat niet, dan bepalen je instellingen of de ingebouwde standaard de stand, en volgens de handleiding van Anthropic kan dat ook auto mode zijn, waarin een tweede model beslist wat er zonder vragen door mag.

Met --disallowedTools "*" krijgt Claude geen enkel gereedschap: hij kan alleen lezen wat het script hem geeft en tekst teruggeven. Moet hij zelf bestanden kunnen lezen, dan geef je hem met --tools "Read,Glob,Grep" alleen gereedschap om te lezen en te zoeken. Koppelingen met andere diensten vallen daar niet onder; die haal je weg met --disallowedTools "mcp__*". En --model sonnet kiest een lichter model dan Opus, dat voor vergelijken en samenvatten meestal goed genoeg is.

Zonder extra opties leest claude -p dezelfde instellingen, CLAUDE.md en koppelingen als een gewone sessie in die map. Draai een taak daarom in een eigen map, buiten de map van je website.

Een vast moment: een timer of cron

Op een Linux-server start je iets op een vast moment met een timer van systemd, het onderdeel dat de diensten op je server beheert. Zo’n timer bestaat uit twee kleine bestanden. Het eerste zegt wat er moet gebeuren: welk script, onder welke gebruiker, en hoe lang het mag duren voordat systemd het stopt. Het tweede zegt wanneer. Voor Lotte staat daarin OnCalendar=Mon *-*-01..07 07:30, wat betekent: een maandag die op de eerste tot en met de zevende van de maand valt, om 07.30. Dat is altijd de eerste maandag. Met Persistent=true erbij draait de taak alsnog als de server op dat moment uit stond.

Het oudere systeem cron kan het ook, met één regel. Juist voor de eerste maandag van de maand is cron wel verraderlijk. Vul je zowel de dag van de maand als de dag van de week in, dan draait cron de taak als één van de twee klopt, dus op de eerste zeven dagen én op elke maandag. Met een timer heb je dat probleem niet. Kies een van de twee, niet allebei, anders draait je taak dubbel.

Twee commando’s heb je daarna nodig om te zien of het werkt:

  • systemctl list-timers laat zien wanneer een taak voor het laatst draaide en wanneer weer.
  • journalctl -u met de naam van de dienst laat het logboek zien, met de foutmelding als het misging.

Je server stuurt je meestal geen mail als een taak mislukt, dus je kijkt zelf. Kies ook een rustig moment. Op een server die met het script van retrAIt is ingericht, loopt om 03.30 de nachtelijke back-up en kan om 04.00 een herstart volgen na een update. Daar plan je niets tussen.

De laatste stap blijft van jou

Op de eerste maandag van de maand staat er een bestand met verschillen klaar. Lotte leest het, kijkt bij elk punt of het klopt en past de pagina zelf aan. Soms staat er een verschil in dat geen fout is, omdat een oude prijs bewust bij een aanbieding van vorig jaar staat. Ook dat beoordeelt zij.

Zo houd je het bij elke taak die vanzelf draait: Claude bereidt voor in een bestand, een mens beslist. Een taak die vanzelf draait, krijgt geen gereedschap om te mailen of iets op je site te zetten. Hoe je dat verder dichtzet, met aandacht voor tekst van buiten en voor sleutels, lees je in Automatiseren met AI zonder dat het misgaat. Een uitgewerkt voorbeeld met cijfers staat in Een weekrapport dat zichzelf schrijft.

Wat het kost en wat er mis kan gaan

Elke keer dat de taak draait, gebruikt hij je abonnement. Bij Pro en Max delen je gesprekken in de app, je sessies met Claude Code en je taken dezelfde limieten, met een grens per vijf uur en een grens per week. Een taak die eens per maand vijf pagina’s leest, merk je nauwelijks. Een taak die elk uur je hele site leest, kan je limiet opmaken. Met /usage in een gewone sessie zie je hoeveel je gebruikt. Wat de abonnementen inhouden, staat in Wat Claude Code kost.

Een taak kan ook stil mislukken, bijvoorbeeld doordat je login bij Claude verlopen is of je limiet op was op het moment dat hij draaide. Een verlopen login herstel je door claude in een gewone sessie te starten en /login te typen; in een taak kan dat niet. Let ook op updates, want Claude Code werkt zichzelf bij. De handleiding van Anthropic meldt dat de stand --bare, die je abonnement niet gebruikt maar een betaalde API-sleutel, in een latere versie de standaard wordt voor -p. Mislukt je taak na een update ineens met een melding over inloggen, kijk dan eerst daarnaar.

Er zijn andere manieren om Claude te herhalen, maar ze passen minder goed bij taken op je eigen server. Met /loop herhaal je een opdracht zolang je sessie openstaat, en zo’n herhaling stopt na zeven dagen vanzelf. Routines van Anthropic draaien in de cloud, ook als je server uit staat, maar ze zijn nog een proefversie en werken met een verse kopie van een project, niet met de bestanden op je server.

Begin met één taak die eens per week of eens per maand draait. Probeer het commando eerst met de hand, lees de uitkomst kritisch, en zet pas daarna de timer aan. De details staan in de handleiding van Anthropic over Claude Code zonder gesprek en over de toestemmingsstanden, in de beschrijving van systemd-timers en in de uitleg over herhalen binnen een sessie.

Foto bovenaan: Suhas Hanjar via Pexels

Delen

Ken je iemand die hier iets aan heeft?

Stuur het door, of deel het als beeld in je story of op LinkedIn.

Als beeld, voor je story of een post

Op een telefoon deel je het beeld meteen, bijvoorbeeld als story op Instagram of in je WhatsApp-status. Op een computer bewaar je het. Zet de link erbij, in je bericht of als sticker.

Meer over automatiseren met agents

Alles over automatiseren met agents