Publicatie:Command line tools automatiseren

Uit Cultureel Erfgoed Standaardentoolbox
Naar navigatie springen Naar zoeken springen


Samenvatting

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.


Referentie
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

Bat script creatie.png

Belangrijk, slaag het bestand op als een .bat bestand. Verander de naam en typ manueel ".bat" als extensie.

Script bestand opslaan.png

Klik vervolgens op "Opslaan/Save".

Open het Windows start menu en typ "Powershell", selecteer "Run as Administrator" druk vervolgens op enter.

Powershell openen als administrator.png

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.

Schtasks create task.png

Je dient de volgende respons terug te krijgen.

Schtasks repsons task created successfully.png

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.

klik op de thumbnail













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:


Gebruik

Taken worden gepland aan de hand van launchd .plist configuratie bestanden en een bash script. In plist bestand dient verwezen te worden naar een bash script. In het bash script staat het commando dat moet geautomatiseerd 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.

Screenshot locatie bash binary.png

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.


Aanpassen tekstbestand met sh extensie.png

Klik op "Use .sh".

Tekstbestand extensie aanpassen bevestigen macos.png

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.

Nieuw tekstbestand aanmaken ubuntu.png

kopieer en plak #! /bin/bash en plaats het op de eerste lijn.

Ubuntu script schrijven.png

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.

Snscrape script voorbeeld.png

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".

Open terminal in folder van het script.png

Voer het volgende commando uit en druk op enter

chmod +x snscrape-arscaudio.sh

Ubuntu script uitvoerbaar maken.png


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.

Nieuw taak plannen crontab.png


Nieuwe taken kunnen onder elkaar geplaats worden op een nieuwe lijn.

Meerdere taken in crontab.png


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.

Taak uitzetten crontab.png