Trädvy Permalänk
Medlem
Plats
Långtbortistan
Registrerad
Mar 2007

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?

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

Trädvy Permalänk
Medlem
Registrerad
Feb 2006

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

Trädvy Permalänk
Medlem
Plats
Uppsala
Registrerad
Jun 2011

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?

Trädvy Permalänk
Medlem
Plats
Långtbortistan
Registrerad
Mar 2007
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.

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

Trädvy Permalänk
Medlem
Plats
/
Registrerad
Feb 2003

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/ )

-