3. Scripts pràctics i tasques programades
Ja saps escriure un script. Ara toca fer-lo servir per al que fan els administradors de veritat: copiar dades, crear comptes i vigilar el disc, i després deixar que l’ordinador ho repetisca sol. Esta pàgina és la preparació de la sessió presencial del 24 de novembre: aquell dia escriuràs, provaràs i programaràs estos scripts.
1. Script de còpia de seguretat amb data
Sección titulada «1. Script de còpia de seguretat amb data»L’idea: comprimir una carpeta en un únic fitxer, posant la data en el nom perquè cada dia genere un fitxer diferent i no se sobreescriguen les còpies anteriors.
#!/bin/bash# backup.sh · còpia comprimida amb data# Ús: ./backup.sh <carpeta_origen> <carpeta_destí>if [ $# -ne 2 ]; then echo "Ús: $0 <origen> <destí>" >&2 exit 1fiorigen=$1desti=$2if [ ! -d "$origen" ]; then echo "No existeix la carpeta $origen" >&2 exit 2fimkdir -p "$desti"data=$(date +%Y-%m-%d)arxiu="$desti/backup_$data.tar.gz"if tar -czf "$arxiu" "$origen"; then echo "Còpia creada: $arxiu"else echo "La còpia ha fallat" >&2 exit 3fi# Backup.ps1 · còpia comprimida amb dataparam( [Parameter(Mandatory)][string]$Origen, [Parameter(Mandatory)][string]$Desti)if (-not (Test-Path $Origen -PathType Container)) { Write-Error "No existeix la carpeta $Origen" exit 2}New-Item -ItemType Directory -Path $Desti -Force | Out-Null$data = Get-Date -Format "yyyy-MM-dd"$arxiu = Join-Path $Desti "backup_$data.zip"Compress-Archive -Path $Origen -DestinationPath $arxiu -Forceif ($?) { Write-Host "Còpia creada: $arxiu"} else { exit 3}Fixa’t en què fa cada part: valida els paràmetres (exit 1 o 2 si falten o són incorrectes), crea el destí si no existix, forma el nom amb la data i comprova si la còpia ha anat bé abans de dir que ho ha fet. Eixa última comprovació és la que separa un script fiable d’un que menteix.
Coses que cal saber:
tar -czfcrea (c) un arxiu comprimit amb gzip (z) en el fitxer indicat (f). Si l’origen és una ruta absoluta,taravisa que lleva la barra inicial (Removing leading/): és normal i fa que la còpia siga més fàcil de restaurar.Compress-Archivede Windows PowerShell 5.1 té limitacions amb fitxers molt grans (al voltant de 2 GB) i amb fitxers oberts per altres programes. Per a còpies grans s’usarobocopyo altres eines (pàgina 4).- Comprova sempre el resultat:
tar -tzf /backups/backup_2026-11-24.tar.gzllista el contingut, i en Windows pots obrir el.zip.
2. Script d’alta massiva d’usuaris
Sección titulada «2. Script d’alta massiva d’usuaris»Preparar un aula nova vol dir crear 25 comptes. Amb un fitxer usuaris.txt (un nom per línia) i un bucle ho resols en un segon.
#!/bin/bash# crear_usuaris.sh · alta massiva des d'un fitxer (un nom per línia)# Cal privilegis: sudo ./crear_usuaris.sh usuaris.txtif [ "$(id -u)" -ne 0 ]; then echo "Cal executar-lo amb sudo" >&2 exit 1fiif [ $# -ne 1 ] || [ ! -f "$1" ]; then echo "Ús: sudo $0 <fitxer_amb_noms>" >&2 exit 2firead -s -p "Contrasenya inicial: " clauechowhile read -r usuari; do [ -z "$usuari" ] && continue if id "$usuari" > /dev/null 2>&1; then echo "Ja existeix: $usuari" else useradd -m -s /bin/bash "$usuari" echo "$usuari:$clau" | chpasswd chage -d 0 "$usuari" echo "Usuari creat: $usuari" fidone < "$1"#Requires -RunAsAdministrator# CrearUsuaris.ps1 · alta massiva des d'un fitxer (un nom per línia)# Ús: .\CrearUsuaris.ps1 -Fitxer .\usuaris.txtparam([Parameter(Mandatory)][string]$Fitxer)$clau = Read-Host "Contrasenya inicial" -AsSecureStringGet-Content $Fitxer | Where-Object { $_.Trim() -ne "" } | ForEach-Object { if (Get-LocalUser -Name $_ -ErrorAction SilentlyContinue) { Write-Host "Ja existeix: $_" } else { New-LocalUser -Name $_ -Password $clau | Out-Null Write-Host "Usuari creat: $_" }}Punts clau:
- Necessita privilegis.
useradd/chpasswddemanensudo;New-LocalUserexigix una consola de PowerShell oberta com a administrador (la línia#Requires -RunAsAdministratorfa que PowerShell ho comprove i pare si no ho és). New-LocalUsernecessita contrasenya o-NoPassword. Sense cap dels dos, intenta demanar-la per teclat per a cada usuari, i l’script s’atura a esperar. Ací la demanem una sola vegada amb-AsSecureStringi la reutilitzem.-NoPasswordcrea comptes sense contrasenya i només és acceptable en una màquina de proves.- En Linux,
useradd -mcrea el compte amb la carpeta personal, però sense contrasenya, de manera que ningú no hi podria entrar. Per aixòchpasswdli assigna la contrasenya inicial ichage -d 0obliga a canviar-la en el primer inici de sessió. - No escrigues mai una contrasenya dins de l’script: es queda guardada en el fitxer.
- Una política de contrasenyes massa dèbil pot fer fallar l’alta. Si passa, tria’n una de més llarga i complexa.
- La neteja de la prova:
sudo userdel -r nom(Linux) iRemove-LocalUser -Name nom(Windows; la carpeta de perfil s’esborra a part).
3. Script de monitoratge del disc
Sección titulada «3. Script de monitoratge del disc»Un monitoratge simple: calcular quin percentatge del disc està ple i avisar si passa d’un llindar (aquí, el 80 %). Tant en Bash com en PowerShell, este script anota cada comprovació en un fitxer de registre, perquè les tasques programades no tenen pantalla i, si no ho escrius, no et pots assabentar de res.
#!/bin/bash# comprovar_disc.sh · registra l'ús del disc i avisa si passa del llindar# Ús: ./comprovar_disc.sh [llindar] (80 per defecte)llindar=${1:-80}registre="$HOME/disc.log"us=$(df -P / | tail -1 | awk '{print $5}' | tr -d '%')data=$(date '+%Y-%m-%d %H:%M')echo "$data · disc al $us%" >> "$registre"if [ "$us" -gt "$llindar" ]; then echo "$data · AVÍS: el disc supera el $llindar%" | tee -a "$registre"fi# ComprovarDisc.ps1 · registra l'ús del disc i avisa si passa del llindarparam([int]$Llindar = 80)$registre = Join-Path $env:USERPROFILE "disc.log"$disc = Get-PSDrive C$us = [math]::Round($disc.Used / ($disc.Used + $disc.Free) * 100)$data = Get-Date -Format "yyyy-MM-dd HH:mm"Add-Content -Path $registre -Value "$data · disc al $us%"if ($us -gt $Llindar) { Write-Host "AVÍS: el disc supera el $Llindar%" Add-Content -Path $registre -Value "$data · AVÍS: el disc supera el $Llindar%"}Com funciona la línia que obté el percentatge en Bash: df -P / mostra l’ús de l’arrel (el -P evita que una línia llarga es partisca en dues), tail -1 es queda amb l’última línia, awk '{print $5}' n’agafa la cinquena columna (per exemple 42%) i tr -d '%' lleva el símbol. ${1:-80} significa «el primer paràmetre, o 80 si no hi ha cap». Al laboratori pots seguir este script línia a línia (pestanya «Traçador», script «Comprovar disc»).
4. Programar tasques en Linux: cron
Sección titulada «4. Programar tasques en Linux: cron»De poc serveix tindre scripts útils si cal recordar-se d’executar-los. cron és el planificador de Linux: un servei (cron) que cada minut mira les llistes de tasques programades (els crontabs) i llança les que toquen. Cada usuari té el seu, que s’edita amb crontab -e. Cada línia té cinc camps de temps i l’ordre:
┌──────── minut (0-59)│ ┌────── hora (0-23)│ │ ┌──── dia del mes (1-31)│ │ │ ┌── mes (1-12)│ │ │ │ ┌ dia de la setmana (0-7; 0 i 7 = diumenge)│ │ │ │ │* * * * * ordre_a_executar| Línia de crontab | Quan s’executa |
|---|---|
30 2 * * * |
Cada dia a les 02:30 |
0 * * * * |
Cada hora en punt |
*/5 * * * * |
Cada 5 minuts |
0 9 * * 1 |
Cada dilluns a les 9:00 |
0 8 * * 1-5 |
De dilluns a divendres a les 8:00 |
0 0 1 * * |
El dia 1 de cada mes, a mitjanit |
* és «qualsevol valor», , separa valors (1,15), - indica un interval (1-5) i / un pas (*/5). Per a la pràctica de classe, la línia és:
*/5 * * * * /home/usuari/comprovar_disc.sh >> /home/usuari/cron.log 2>&1Ordres útils:
crontab -e # editar les teues tasquescrontab -l # llistar-lessystemctl status cron # el servei està actiu? (en Fedora i derivades es diu crond)cat ~/disc.log # el registre del nostre scriptgrep CRON /var/log/syslog | tail # el que ha llançat cron (Debian i Ubuntu)Errors típics amb cron:
- Rutes absolutes. cron s’executa amb un entorn mínim i una carpeta de treball que no és la teua: escriu
/home/usuari/comprovar_disc.sh, no./comprovar_disc.sh. L’script ha de tindre permís d’execució. - El
%en un crontab. En una línia de crontab el%té un significat especial i s’ha d’escriure\%. Per això posem eldate +%Y-%m-%ddins de l’script i no en la línia de cron. - Eixida perduda. Si no redirigeixes l’eixida (
>> fitxer 2>&1), cron intenta enviar-la per correu local. Registra-ho tot. crontab -resborra tot el crontab sense preguntar. Per a llevar una tasca, edita i esborra la línia.
Per a una execució única hi ha at: echo "/home/usuari/backup.sh /home/usuari/documents /home/usuari/backups" | at 02:30 (cal el paquet at; atq llista les pendents).
5. Programar tasques en Windows: el Programador de tasques
Sección titulada «5. Programar tasques en Windows: el Programador de tasques»El Programador de tasques (Task Scheduler, taskschd.msc) fa la mateixa funció amb una interfície gràfica. Una tasca té dues peces essencials:
- el desencadenador (trigger): quan s’executa (a una hora, en iniciar sessió, cada cert temps…);
- l’acció: què s’executa.
Per a una tasca en la interfície gràfica: Crea una tasca… → pestanya Desencadenadors → Nou… (aquí s’indica «Repeteix la tasca cada: 5 minuts» per a la de classe) → pestanya Accions → Nova… → acció «Inicia un programa», amb:
- Programa o script:
powershell.exe - Afig arguments:
-NoProfile -ExecutionPolicy Bypass -File "C:\Scripts\ComprovarDisc.ps1"
Per línia d’ordres, des de CMD o PowerShell, amb schtasks:
schtasks /create /tn "BackupDiari" /tr "powershell.exe -NoProfile -ExecutionPolicy Bypass -File C:\Scripts\Backup.ps1 -Origen C:\Dades -Desti D:\Backups" /sc daily /st 02:30schtasks /create /tn "ComprovarDisc" /tr "powershell.exe -NoProfile -ExecutionPolicy Bypass -File C:\Scripts\ComprovarDisc.ps1" /sc minute /mo 5schtasks /query /tn "ComprovarDisc" /v /fo listschtasks /run /tn "ComprovarDisc"schtasks /delete /tn "ComprovarDisc" /fUna tasca creada amb el teu usuari només s’executa mentre tens la sessió iniciada, i en un portàtil, per defecte, no s’executa amb bateria (pestanya Condicions). Per a tasques de sistema es pot usar /ru SYSTEM, però exigix una consola d’administrador.
Dos mons, la mateixa idea
Sección titulada «Dos mons, la mateixa idea»| Linux | Windows | |
|---|---|---|
| Planificador | cron (servei) |
Programador de tasques |
| On es defineix | crontab -e |
Interfície gràfica o schtasks |
| «Quan» | Els 5 camps | Desencadenador |
| «Què» | L’ordre de la línia | Acció |
| Cada 5 minuts | */5 * * * * |
/sc minute /mo 5 |
| Cada dia a les 2:30 | 30 2 * * * |
/sc daily /st 02:30 |
| On mirar el resultat | El teu registre (>> fitxer 2>&1) |
El teu registre; i Historial de la tasca |
| Executar una vegada | at |
/sc once |
6. Què faràs a la presencial
Sección titulada «6. Què faràs a la presencial»Individualment, en el sistema que tinga assignat el teu equip (o en els dos, si dona temps):
- Escriure i provar l’script de còpia de seguretat sobre una carpeta de prova.
- Escriure i provar l’script d’alta massiva de 5 usuaris a partir d’un fitxer de text.
- Escriure i provar l’script de comprovació del disc.
- Programar la comprovació cada 5 minuts i verificar en el registre que s’ha executat sola almenys dues vegades.
- Documentar amb captures i una reflexió breu. Es lliura en Aules abans d’acabar la classe.
Els detalls de l’entrega són a l’activitat 7.
Comprova el que has après
Sección titulada «Comprova el que has après»-
Per què un script de còpia posa la data en el nom del fitxer?
Resposta
Perquè cada execució genere un fitxer diferent. Sense la data, la còpia d’avui sobreescriuria la d’ahir i només tindries la més recent.
-
Has escrit
schtasks /create /tn "Copia" /tr "C:\Scripts\Backup.ps1" /sc daily /st 02:30. La tasca s’executa però no fa res. Per què, i com es corregix?Resposta
Perquè Windows obri el
.ps1amb l’aplicació associada en lloc d’executar-lo amb PowerShell. S’ha de posar/tr "powershell.exe -NoProfile -ExecutionPolicy Bypass -File C:\Scripts\Backup.ps1". -
Escriu la línia de crontab que executa
/home/ana/neteja.shde dilluns a divendres a les 7:30.Resposta
30 7 * * 1-5 /home/ana/neteja.sh -
Un script de PowerShell fa
New-LocalUser -Name $nomdins d’un bucle i es queda parat esperant. Què passa?Resposta
New-LocalUsernecessita-Password(unSecureString, per exemple ambRead-Host -AsSecureString) o-NoPassword. Sense cap dels dos, el cmdlet demana la contrasenya per teclat. A més, cal una consola d’administrador. -
Una tasca de cron funciona si l’executes a mà, però no quan la programa cron. Digues dues causes probables.
Resposta
Rutes relatives (cron no executa des de la teua carpeta ni amb el teu
PATHcomplet) i falta de permís d’execució en l’script. També pot ser un%sense escapar en la línia de crontab.
Glossari
Sección titulada «Glossari»| Valencià | Castellano |
|---|---|
| còpia de seguretat | copia de seguridad |
| alta massiva | alta masiva |
| monitoratge | monitorización |
| llindar | umbral |
| registre (log) | registro (log) |
| tasca programada | tarea programada |
| Programador de tasques | Programador de tareas |
| desencadenador (trigger) | desencadenador (trigger) |
| acció | acción |
| privilegis | privilegios |
| consola d’administrador | consola de administrador |
| contrasenya | contraseña |
Esta web no usa cookies ni recoge datos personales. Tu navegador solo guarda, en tu propio equipo, algunas preferencias: el tema claro u oscuro, el estado del menú y, en los laboratorios, la última pestaña abierta y el tamaño de letra.