Permalänk
Medlem

Cron, Docker och MySQL

Jag försöker skapa ett script som skall köra ett MySQL-kommando mot en databas som körs i Docker. Jag får scriptet att fungera när jag kör det i terminalen men inte när det körs av cron. Jag har provat alla möjliga varianter av fnuttar, &-tecken och annat, ändrat PATH mm men får det inte att fungera. Scriptet körs men inte själva Docker-kommandot, resultatet blir 0 vad jag än har i databasen.

Jag försöker få ut antal rader med ett visst värde ur en tabell mha följande rad:

!#/bin/bash antalFel=$(/usr/bin/docker exec -u 1000 -it mariadb mysql -u<user> -p<password> -e "USE <TABLE>; SELECT * FROM states WHERE state=-100.0"|wc -l) 2>&1

När jag kör scriptet manuellt får jag ett svar, t.ex. 8, men det blir 0 varje gång det körs av cron.

Jag har funderat på om jag behöver ursäkta något specialtecken, jag vet t.ex. att % inte fungerar i cron utan måste skrivas \%, men jag hittar inget om " eller * och det fungerar inte heller med \".

Är det någon som har något tips på hur jag kommer vidare?

Visa signatur

Det finns bara två sorters hårddiskar: de som har gått sönder och de som skall gå sönder.

Permalänk

@zarkov: En sak jag märkte när jag gjorde ett cron-script är att system-variabeln PATH inte är satt - dvs den vet inte i vilka mappar den ska söka efter exekverbara filer. Så istället för att skriva "ls" måste du skriva "/usr/bin/ls" osv, dvs hela pathen. Det är kanske det som är felet?

EDIT: Såg nu att du skrivit det på lokala pathen, och att mariadb kördes i dockern.. Då är det nog inte problemet, sorry :P. Läste för snabbt.

Permalänk
Medlem

har användaren vars cronjobb du lägger till, rättigheter att exekvera scriptet?
är inte super på docker, men måste du inte säga vilken container du vill ska köra ditt kommando?

Permalänk
Medlem
Skrivet av stingray454:

@zarkov: En sak jag märkte när jag gjorde ett cron-script är att system-variabeln PATH inte är satt - dvs den vet inte i vilka mappar den ska söka efter exekverbara filer. Så istället för att skriva "ls" måste du skriva "/usr/bin/ls" osv, dvs hela pathen. Det är kanske det som är felet?

EDIT: Såg nu att du skrivit det på lokala pathen, och att mariadb kördes i dockern.. Då är det nog inte problemet, sorry :P. Läste för snabbt.

Jo, jag har lagt till PATH och dessutom använt den absoluta sökvägen till docker-kommandot. Jag har även provat att ge en absolut sökväg till mysql-kommandot som körs i containern utan skillnad.

Skrivet av Hothep:

har användaren vars cronjobb du lägger till, rättigheter att exekvera scriptet?
är inte super på docker, men måste du inte säga vilken container du vill ska köra ditt kommando?

Ja, jag använder samma användare för crontab och manuell exekvering. Scriptet körs men inte docker-kommandot. Containern heter "mariadb" och i containern vill jag köra "mysql" med ett antal flaggor.

För tillfället ser scriptet ut så här:

#!/usr/bin/env bash export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin error=$(/usr/bin/docker exec -u 1000 -d mariadb /usr/bin/mysql -u<user> -p<password> -e "USE db; SELECT * FROM states WHERE state=-100.0"|wc -l) 2>&1 logger "$error errors found"

Jag har provat med "-d", med "-dt" och med "-it" utan att det gör någon skillnad.

Visa signatur

Det finns bara två sorters hårddiskar: de som har gått sönder och de som skall gå sönder.

Permalänk
Medlem

Finns en /var/log/syslog som säger nåt om "CRON" vid förväntat klockslag?

(Är det ett alternativ att prova skedulera med systemd? https://jeetblogs.org/post/scheduling-jobs-with-systemd/ )

Visa signatur

| 212965 00 ] == :^D * ==)