Cron-Jobs

Kampfgummibaerlie

Datenbank-Guru
Beiträge
743
Ich bin soweit, dass ich die Extension auf meinem Ubuntu-Server installiert habe, in der postgres-db die entsprechende extension installiert, das Problem hier ist, mein Code wird anstatt jede Minute zu zünden >garnicht< gezündet, auch nicht nach 5 Minuten oder so.

Hier mein Code:
Code:
create table ints(id int);

create or replace function insert() returns void as $$ insert into public.ints values (1) $$ language sql;

SELECT cron.schedule (
  'Insert_Cron',
  '1 0-23 * * *',
  'select public.insert();'
);

Nach einer gewissen Wartezeit (sollte ja minütlich gezündet werden) nach folgender Abfrage:
Code:
select * from public.ints

kommt kein Resultat heraus...

Bei der Abfrage der Cron-Jobs:
Code:
select * from cron.job

kommt eine Zeile, welche eigentlich, denke ich, aussagt, dass alles laufen sollte (?):
Code:
49    "1 0-23 * * *"    "select public.insert();"    "localhost"    5432    "postgres"    "postgres"    true    "Insert_Cron"

die 49 als id sind nur, weil ich schon eine weile probiere ^^

Danke für positive Rückmeldungen!

Kampfgummibaerlie =)
 
Werbung:
Ich bin soweit, dass ich die Extension auf meinem Ubuntu-Server installiert habe, in der postgres-db die entsprechende extension installiert, das Problem hier ist, mein Code wird anstatt jede Minute zu zünden >garnicht< gezündet, auch nicht nach 5 Minuten oder so.

Hier mein Code:
Code:
SELECT cron.schedule (
  'Insert_Cron',
  '1 0-23 * * *',
  'select public.insert();'
);
War es beim Testen schon mal eine Minute nach einer vollen Stunde? Mit der Angabe »1 0-23 * * *« wird er nicht jede Minute sondern eben immer eine Minute nach jeder vollen Stunde gestartet - jede Minute wäre einfach »* * * * *« (als Stunde ist 0-23 jede Stunde, da kann man auch * verwenden), siehe Crontabrechner.
 
Code:
1    1        "postgres"    "postgres"    "insert into public.values(value) values (1);"    "failed"    "connection failed"        
1    2        "postgres"    "postgres"    "insert into public.values(value) values (1);"    "failed"    "connection failed"        
1    3        "postgres"    "postgres"    "insert into public.values(value) values (1);"    "failed"    "connection failed"        
1    4        "postgres"    "postgres"    "insert into public.values(value) values (1);"    "failed"    "connection failed"        
1    5        "postgres"    "postgres"    "insert into public.values(value) values (1);"    "failed"    "connection failed"        
1    6        "postgres"    "postgres"    "insert into public.values(value) values (1);"    "failed"    "connection failed"        
1    7        "postgres"    "postgres"    "insert into public.values(value) values (1);"    "failed"    "connection failed"        
1    8        "postgres"    "postgres"    "insert into public.values(value) values (1);"    "failed"    "connection failed"        
1    9        "postgres"    "postgres"    "insert into public.values(value) values (1);"    "failed"    "connection failed"        
1    10        "postgres"    "postgres"    "insert into public.values(value) values (1);"    "failed"    "connection failed"        
1    11        "postgres"    "postgres"    "insert into public.values(value) values (1);"    "failed"    "connection failed"        
1    12        "postgres"    "postgres"    "insert into public.values(value) values (1);"    "failed"    "connection failed"        
1    13        "postgres"    "postgres"    "insert into public.values(value) values (1);"    "failed"    "connection failed"        
1    14        "postgres"    "postgres"    "insert into public.values(value) values (1);"    "failed"    "connection failed"        
1    15        "postgres"    "postgres"    "insert into public.values(value) values (1);"    "failed"    "connection failed"        
1    16        "postgres"    "postgres"    "insert into public.values(value) values (1);"    "failed"    "connection failed"

connection failed...
nur wieso? die php-seite, die sich mit 127.0.0.1 verbindet kann sich verbinden...
muss man den server localhost explizit in der pg_hba.conf angeben?
 
Anmeldung mittels PHP:
Code:
$conn = pg_connect("host=127.0.0.1 dbname=Mimoso user=postgres");

habe keine Ahnung, wie sich so eine Art nennt, denke aber pdo oder sowas(?)


Die Log der DB selber:
Code:
2023-08-13 00:07:00.033 CEST [2095770] postgres@postgres FATAL:  Passwort-Authentifizierung für Benutzer »postgres« fehlgeschlagen
2023-08-13 00:07:00.033 CEST [2095770] postgres@postgres DETAIL:  Benutzer »postgres« hat kein Passwort zugewiesen.

habe mir nur die wesentlichste Zeiler herausgeholt... ich denke da liegt der Fehler ;)

die pg_hba.conf:
pg_hba.png




Wichtige Notiz für die Zukunft:
Log-Files durchschauen =D

auch, wenn ich nicht ganz verstehe, warum er ein passwort verlangt, wenn ich in der hba file trust eingestellt habe... :/
 
Wie es aussieht, funktioniert es jetzt auch bei mir ;D

habe es am Ende mit der ausdauernden Methode probiert, klappt aber ^^


Habe zu Schluss die Variante >nach< dem "or" eingesetzt ;)

cron.png

wiedermal was neues gelernt =D

EDIT:
ich habe keine Ahnung mehr, wie ich das repository in die libraries gebracht habe, muss man jedoch vorher machen ;) wenn man das hat, einfach den schritten folgen:
Code:
create extension pg_cron;
create table bla(id int);
select cron.schedule('insert', '* * * * *', 'insert into bla(id int) values(1)');

und es führt sich pro Minute ein Datensatz mit dem Wert 1 hinzu ;)

Bemerkung anbei:
Ich glaube, da habe ich irgendwo einen Fehler drin, aber ich bin sehr stark beruhigt und mache mal eine Pause xD
 
Zuletzt bearbeitet:
Um mit dem Thema relativ abzuschließen und meine Lösung zu veröffentlichen:

Die Extension installieren (Ubuntu):
Code:
apt-get install pg_cron;


Die Extension erstellen:
Code:
create extension pg_cron;

Eine Tabelle für die Werte erstellen:
Code:
create table val(id integer);

Einen Cron-Job erstellen, welcher minütlich eine 1 in die Tabelle schreibt:
Code:
select cron.schedule ('insert', '* * * * *', 'insert into public.val(id) values (1);');

Für die, die einen Cron-Rechner möchten, schnell gegoogelt:

Eine offenbare Lösung des Fehler-Problems, dass kein Wert eingeügt wird oder so:
Code:
UPDATE cron.job SET nodename = '';

die Offenbarung, dass nach einer gewissen Zeit die Werte dank dem Cron-Job eingetragen werden:
Code:
select * from val;

Bei mir kommt etwas wie folgt heraus:
Code:
1
1
1
1
1
1
1

Ich werde mich jetzt noch ein wenig spielen, bin mir aber ziemlich sicher, dass diese Cron-Funktionen mächtig sind und genau das sind, was ich brauche xD (ein neues Thema zum lernen)...
 
Werbung:
Wenn jemand Datenbankenübergreifende Cron-Jobs anlegen möchte, und nicht nur in der Postgres Standarddatenbank arbeiten möchte, hier ein Guide, wie man das erreichen kann ;)


Als ein Tipp hier die Lösung vom Problem:
Code:
UPDATE cron.job SET database = 'database1' WHERE jobid = 106;
 
Zurück
Oben