Publicatie:Command line tools automatiseren
In het kader van het project Best practices voor de archivering van sociale media in Vlaanderen en Brussel werden verschillende command line tools getest om socialemediaplatformen te archiveren. Deze handleiding beschrijft hoe command line tools acties kunnen worden geautomatiseerd zoals bijvoorbeeld het archiveren van een sociaal media account om de zoveel tijd. Met het gebruik van taakplanner software zoals crontab, launchd etc.
Titel | Command line tools automatiseren (Voorkeurstitel) |
Locatie | |
Uitgever | |
Jaar van uitgave | 2021 |
Rechten | CC-BY-SA |
Persistent ID |
Taakplanners zijn op elke systeem beschikbaar,Schtasks op Windows, Launchd op Mac Os en Crontab op Linux. Het is mogelijk om alle command line tools automatisch te starten met alle beschikbare opties die normaal gebruikt worden tijdens het manueel uitvoeren van een opdracht. Deze processen worden in de achtergrond uitgevoerd zonder interactie van de gebruiker.
Windows
Schtasks is standaard beschikbaar op windows.
Gebruik
Het uitvoeren van command line programmas met schtasks gebeurd aan de hand van een .bat script. Volledige documentatie is hier beschikbaar MS-DOS and Windows command line schtasks command.
Nieuwe taak plannen
Open kladblok, en kopier en plak het volgende in een leeg kladblok document:
@ECHO OFF
PAUSE
EXIT
Plaats je commando op lijn 2, tussen @ECHO OFF
en PAUSE
.
Bijvoorbeeld:
@ECHO OFF
youtube-dl -f best https://www.youtube.com/channel/UCM2SO69PhFRKKEYwGSV4sHQ
PAUSE
EXIT
Belangrijk, slaag het bestand op als een .bat bestand. Verander de naam en typ manueel ".bat" als extensie.
Klik vervolgens op "Opslaan/Save".
Open het Windows start menu en typ "Powershell", selecteer "Run as Administrator" druk vervolgens op enter.
In het "User Account Control" dialoog venster, selecteer "yes".
Voorbeelden:
Dagelijkse uitvoeren van een download van een youtube kanaal met youtube-dl.
schtasks /CREATE /TN yt-dl /TR "C:\Users\lode_\Documents\MEEMOO\Scripts\youtube-dl-basic.bat" /SC DAILY /ST UU:MM
schtasks
: Naam van de taakplanner tool op Windows./CREATE
: "Create"/Maak een nieuwe taak. Vervang door /DELETE om de taak te verwijderen./TN
: "Taskname", de naam van de geplande taak./TR
: "Taskrun", /TR, moet gevolgd worden door een pad naar een programma of script./SC
: "Schedule", /SC, specifieerd de frequentie van de taak. Aanvaarde types zijn, MINUTE, HOURLY, DAILY, WEEKLY, MONTHLY, ONCE, ONSTART, ONLOGON, ONIDLE, ONEVENT./ST
: "Starttime", /ST, De taak zal altijd op dezelfde dag op de gekozen tijd starten. /ST Verwacht een uur en minuten tijdsformaat (24:00), bijvoorbeeld, 14:44, 16:05, 00:20.
Kopier en plak je schtasks commando in de powershell.
Je dient de volgende respons terug te krijgen.
Geplande taak aanpassen
Pas je schtasks taak aan en gebruik de juiste taaknaam (/TN yt-dl) om te verwijzen naar de eerder geplande taak en druk op enter. Als de taak als bestaat vraagt schtasks je om de aanpassing te bevestigen.
Geplande taak verwijderen
Gebruik de /DELETE optie om de geplande taak te verwijderen verwijs naar de exacte taak naam met /TN.
Druk vervolgens op enter. Bevestig met "y" of "n" om de geplande taak te verwijderen.
Voorbeeld:
schtasks /DELETE /TN yt-dl
Mac Os
Launchd is de command line taakplanner ter vervanging van crontab.
Launchd maakt een onderscheid tussen taken's die worden uitgevoerd namens de gebruiker, "agents" en "daemons" die uitgevoerd worden namens de root gebruiker of een andere gebruiker aan de hand van "UserName" key.
Documentatie:
- https://www.launchd.info/
- http://launched.zerowidth.com/
- https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/Introduction.html#//apple_ref/doc/uid/10000172i-SW1-SW1
- https://alvinalexander.com/mac-os-x/launchd-examples-launchd-plist-file-examples-mac/
Gebruik
Taken worden gepland aan de hand van launchd .plist configuratie bestanden en een bash script. In dat .plist bestand dient verwezen te worden naar een bash script waarin het commando staat dat geautomatiseerd moet worden.
Kies de juiste map voor de geplande taak.
- /Library/LaunchDaemons:Plaats het plist bestand in deze map als de taak moet starten zelfs wanneer er geen gebruiker is ingelogd.
- /Library/LaunchAgents:Plaats het plist bestand in deze map wanneer de taak enkel moet starten wanneer er gebruikers zijn ingelogd op het systeem.
- /$HOME/Library/LaunchAgents/: Plist bestanden in deze map worden uitgevoerd onder namens de ingelogde gebruiker. Dit is de folder die zal gebruikt worden voor deze handleiding.
De eerste twee mappen hebben administrator rechten nodig om de plist bestanden te bewerken. Voor de gemakkelijkheid zal voor deze handleiding de derde map gebruikt worden, alle voorbeelden gaan er van uit dat de plist bestanden in /$HOME/Library/LaunchAgents/
geplaatst zijn.
Bash script maken
Elk commando dat in de terminal/command line interface kan worden uitgevoerd kan opgeslagen worden als uitvoerbaar bestand of een script. Een bash script is een tekstbestand met verschillende commando's en een mogelijkheid om logica en condities toe te voegen. MacOs en Linux zijn op vlak van besturingssysteem familie van elkaar en gebruiken allebei de bash shell. Scripts worden opgeslagen met de ".sh" extensie.
Bash scripts, beginnen op macOS met de shebang, "#!/bin/bash
", de "#!
" verteld het systeem dat het tekstbestand een script is en /bin/bash
is de locatie van bash. Dit geeft aan hoe het systeem het script moet interpreteren met bash.
Plaats je commando onder "#!/bin/bash
".
Zoals dit:
#!/bin/sh
/usr/local/bin/instaloader --fast-update profile kbrbe --dirname-pattern=/Users/JouwGebruikersNaam/Desktop/{profile}
Open teksteditor, kopier en plak de shebang (#!/bin/sh
) op de eerste lijn.
Plaats je commando onder de shebang. Het is belangrijk om het absolute pad naar instaloader mee te geven anders kan launchd je script niet starten, "/usr/local/bin/instaloader [opties] [profiel]" Slaag je tekstbestand op. Verander na het opslaang de extensie van het tekstdocument naar .sh.
--dirname-pattern=
: Verwacht een pad gevolgd door {profile}, het zorgt er voor dat instaloader de gearchiveerde inhoud wegschrijft naar het opgegeven pad. In dit geval op het Bureaublad.
Klik op "Use .sh".
Het bestand zou nu de .sh extensie moeten hebben.
Open een nieuwe terminal in de folder van het script en voer het volgende commando uit om het script uitvoerbaar te maken.
chmod +x instaloader_kbr.sh
, gevolgd door enter.
plist maken
Een xml bestand genaamd "property list" of kortweg plist. Dat gebruikt wordt om de taak de gewenste eigenschappen te geven zoals wanneer in de dag/week/maand moet de taak starten. De handleiding van launchd beschrijft plist bestanden als systeem en gebruiker specifieke daemon/agent configuratie bestanden. Gebruik het voorbeeld hieronder als start. Of gebruik de website, http://launched.zerowidth.com/ om je plist te genereren.
Voorbeeld van een plist bestand waarbij de taak maandag (Weekday 1), woensdag (Weekday 3) en vrijdag (Weekday 5) gestart wordt om 10 uur in de ochtend, elke maand. Kopieer en plak in een leeg tekstbestand, pas aan en slaag het bestand op met dezelfde naam als het label, in dit geval "com.kbrbe.instaloader.plist".
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.kbrbe.instaloader</string>
<key>ProgramArguments</key>
<array>
<string>$HOME/Desktop/instaloader_kbr.sh</string>
</array>
<key>StartCalendarInterval</key>
<array>
<dict>
<key>Hour</key>
<integer>10</integer>
<key>Weekday</key>
<integer>1</integer>
</dict>
<dict>
<key>Hour</key>
<integer>10</integer>
<key>Weekday</key>
<integer>3</integer>
</dict>
<dict>
<key>Hour</key>
<integer>10</integer>
<key>Weekday</key>
<integer>5</integer>
</dict>
</array>
<key>StandardErrorPath</key>
<string>/tmp/launched.com.kbrbe.instaloader.err</string>
<key>StandardOutPath</key>
<string>/tmp/launched.com.kbrbe.instaloader.out</string>
</dict>
</plist>
Het eerste gedeelte Blijft altijd hetzelfde.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
Alle andere informatie, Label, ProgramArguments etc. komen tussen de <plist version="1.0"> ... </plist>
en <dict> ... </dict>
tags te staan.
<key>Label</key>
, dient om de taak een naam te geven, in dit geval com.kbrbe.instaloader
De tag, <key>ProgramArguments</key>
duid de plaats aan in de plist waar er verwezen kan worden naar een bash script.
Zet de locatie van het script tussen <array> ... <string>/pad/naar/script/</string> ... </array>
tags.
<key>StartCalendarInterval</key>, wordt gebruikt om de start tijd aan te geven. De beschikbare opties zijn:
Key | Type | Values |
---|---|---|
Month | Integer | Maand van het jaar (1..12, waarvan 1 januari) |
Day | Integer | Dag van de maand (1..31) |
Weekday | Integer | Dag van de week (0..7, 0 and waarvan 7 en 0 zondag) |
Hour | Integer | Uur van de dag (0..23) |
Minute | Integer | Minuten per uur (0..59) |
<code> <key>StandardErrorPath</key> <string>/tmp/launched.com.kbrbe.instaloader.err</string> <key>StandardOutPath</key> <string>/tmp/launched.com.kbrbe.instaloader.out</string> </code>
Aangezien de launchd taak in de achtergrond gaat lopen is het een goed idee om de [standaard output] en [standaard error] op te slaan in een tekst bestand. Op deze manier is het mogelijk om de bestanden te openen in een tekstverwerkingsprogramma en de mogelijke fouten te bekijken.
Als de taak niet lijkt te werken raadpleeg de tekst bestanden zoals opgegeven onder "StandardErrorPath" en "StandardOutPath". Verwijs naar de /tmp/ map, dan weet je zeker dat launchd er naar kan schrijven.
Nieuwe taak plannen
Plaats het com.kbrbe.instaloader.plist bestand in ~/Library/LaunchAgents/ en open een nieuw terminal venster in deze folder.
Laad het bestand om de taak te plannen met het volgende commando.
launchctl load com.kbrbe.instaloader.plist
Verwijdeer de taak met het volgende commando
launchctl unload com.kbrbe.instaloader.plist
Troubleshooting
Bij elke aanpassing aan het plist bestand moet plist opnieuw worden geladen met, launchctl unload /pad/naar/plist
en launchctl load /pad/naar/plist
.
Linux
Linux en Unix systemen maken gebruik van Crontab om taken te plannen.
Bash script maken
Maak een script met je command en gewenste opties. Open een tekstverwerkingsprogramma zoals gedit.
kopieer en plak #! /bin/bash
en plaats het op de eerste lijn.
Kopieer je commando op de tweede lijn, zorg er voor dat je het pad naar de binary opgeeft.
Om het adres van het gewenste programma te vinden voer het volgende commando uit.
which naam van programma
, bijvoorbeeld, which snscrape
geeft in mijn geval deze respons terug:
/home/lode/.local/bin/snscrape
.
Als voorbeeld is het de bedoelding om elke week de tweets op te halen van een twitter profiel met snscrape.
/home/lode/.local/bin/snscrape twitter-user arscaudio
Slaag het tekstbestand op met een ".sh
" extensie.
Als laatste maak het script uitvoerbaar.
Open het context-menu met rechtermuisklik op lege plek in de map waar het script is opgeslagen en selecteer "open in terminal".
Voer het volgende commando uit en druk op enter
chmod +x snscrape-arscaudio.sh
Nieuwe taak plannen
In crontab worden taken gepland aan de hand van vijf asterisken voor, minuten, uur, dag van de maand, maand, dag van de week. Gevolgd door het commando dat moet uitgevoerd worden. crontab.guru is een handige website om het taak plannen gemakkelijker te maken.
* * * * * opdracht om uit te voeren, of pad naar script.sh
│ │ │ │ │
│ │ │ │ │
│ │ │ │ └───── Dag van de week (0 - 6) (0 tot 6 zijn zondag tot zaterdag, of gebruik namen; 7 is zondag, net zoals 0)
│ │ │ └────────── Maand (1 - 12)
│ │ └─────────────── dag van de maand (1 - 31)
│ └──────────────────── hour (0 - 23)
└───────────────────────── min (0 - 59)
Bijvoorbeeld, 0 10 * * 3 /home/lode/Documents/scripts/snscrape-arscaudio.sh
zal het script "snscrape-arscaudio.sh" elke woensdag van de week uitvoeren.
In een nieuw terminal venster, voer het volgende commando uit, crontab -e
, wanneer er gevraag word welke tekstverwerker moet gebruikt worden, selecteer Nano.
Kopieer en plak jouw crontab taak onderaan in de editor. Optioneel, alle andere lijnen met een "#" voor mogen verwijderd worden.
En druk op CTRL+X, gevolgd "Y" en door enter om het bestand op te slaan.
Nieuwe taken kunnen onder elkaar geplaats worden op een nieuwe lijn.
Taken oplijsten
In een nieuw terminal venster, voer crontab -l
uit om de lijst van geplande taken te zien voor de ingelogde gebruiker.
Taken aanpassen
Voer crontab -e
uit en pas de taak aan.
Een taak uitzetten kan door er een "#" voor te plaatsen.