Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: srript wordt niet goed uitgevoerd in cron  (gelezen 529 keer)

Offline peer

  • Lid
  • Steunpunt: Nee
srript wordt niet goed uitgevoerd in cron
« Gepost op: 2019/05/12, 14:55:52 »
distro debian 9, LXDE minimal
ik probeer een script (test.sh) te laten starten door cron. Het script werkt volledig correct in de terminal maar als het gestart word door cron dan wordt het slechts gedeeltelijk uitgevoerd.
Het script bevat slechts twee commandoregels:
#!/bin/bash

/usr/bin/notify-send "Dit is een testbericht" "Einde bericht"
echo "test.sh is running" >> /home/peer/test.txt


Als ik het script in de terminal uitvoer dan wordt een popup weergeven op het scherm met de notify-send opdracht. Daarnaast wordt een textbestand in mijn homedirectory aangemaakt.
Als ik het script door cron laat uitvoeren dan wordt alleen het textbestand aangemaakt. De popup komt er niet. Het script wordt dus wel gestart door cron.

Ik vermoed dat dit iets te maken heeft met het feit dat de popup een grafisch element is.
Weet iemand hoe ik dit script ook in cron volledig kan laten uitvoeren.

nahjo

  • Gast
Re: srript wordt niet goed uitgevoerd in cron
« Reactie #1 Gepost op: 2019/05/12, 15:02:15 »
In het script als eerste opdrachtregel
export DISPLAY=:0 toevoegen. Dan weet CRON naar welk scherm het moet  ;)

Offline peer

  • Lid
  • Steunpunt: Nee
Re: srript wordt niet goed uitgevoerd in cron
« Reactie #2 Gepost op: 2019/05/12, 15:28:15 »
Ik heb de volgende regels in cron geprobeerd:
* * * * * /home/peer/scripts/test.shen
* * * * * export DISPLAY=:0 && /home/peer/scripts/test.shBeide regels laten het script wel starten maar de popup verschijnt niet.

Als xterm wil starten door cron dan lukt dat met de rgel:
* * * * * export DISPLAY=:0 && /usr/bin/xtermxterm start dan goed op.

Als ik 'export DISPLAY=:0'op de eerste regel zet dan wil cron niet opslaan.

nahjo

  • Gast
Re: srript wordt niet goed uitgevoerd in cron
« Reactie #3 Gepost op: 2019/05/12, 15:45:16 »
#!/bin/bash
export DISPLAY=:0
/usr/bin/notify-send "Dit is een testbericht" "Einde bericht"
echo "test.sh is running" >> /home/peer/test.txt
In het scriptje plaatsen  ;)

Offline peer

  • Lid
  • Steunpunt: Nee
Re: srript wordt niet goed uitgevoerd in cron
« Reactie #4 Gepost op: 2019/05/12, 16:19:33 »
heb ik gedaan. Werkt helaas niet.
Ik heb er nog een regel met XAUTHORITY aan toegevoegd maar ook dat helpt niet.
#!/bin/bash
export DISPLAY=:0
XAUTHORITY=/home/peer/.Xauthority
/usr/bin/notify-send "Dit is een testbericht" "Einde bericht"
echo "test.sh is running" >> /home/peer/test.txt
Met google vond ik een script met het notify-send commando waarin dit bovenaan stond. Maar bij mij werkt het dus gewoon niet.

nahjo

  • Gast
Re: srript wordt niet goed uitgevoerd in cron
« Reactie #5 Gepost op: 2019/05/12, 16:50:52 »
Het zou gewoon moeten werken onder users cron. Onder root cron zal het wat uitgebreider moet qua beeldscherm aansturing.
Zoek maar op notisy-send from root of zo.
gebruikers cron in terminal: crontab -e
root cron in terminal: sudo crontab -e


Offline peer

  • Lid
  • Steunpunt: Nee
Re: srript wordt niet goed uitgevoerd in cron
« Reactie #6 Gepost op: 2019/05/12, 17:08:39 »
ik gebruik telkens 'crontab -e' om crontab aan te passen.
Daarna gebruik ik 'sudo services cron restart' om cron opnieuw te starten.

Ik heb het gevoel dat de export Display=: 0 zou moeten werken. Ik heb ook nog met :0.0 geprobeerd maar dat ging ook niet.

Wellicht ontbreekt er iets in mijn minimale debian omgeving.   

Offline peer

  • Lid
  • Steunpunt: Nee
Re: srript wordt niet goed uitgevoerd in cron
« Reactie #7 Gepost op: 2019/05/12, 17:57:18 »
probleem verder gegoogled.  Zie:
https://askubuntu.com/questions/298608/notify-send-doesnt-work-from-crontabHierin kan ik lezen dat ik de export DISPLAY=:0 niet werkt bij notify-send en dat er een oplossing is met DBUS address. Maar de oplossingen zijn daar DE-afhankelijk en en mijn DE (minimal LXDE) staat daar niet bij. Hier moet ik nog op puzzelen. Vooralsnog vind ik het bijzonder ingewikkeld.

Offline peer

  • Lid
  • Steunpunt: Nee
Re: srript wordt niet goed uitgevoerd in cron
« Reactie #8 Gepost op: 2019/05/13, 13:15:04 »
Na behoorlijk wat googlen en lezen van de man page was ik er zeker van dat de oorzaak van het probleem met de communicatie met DBus te maken heeft. De oplossing is dan om er achter te komen hoe DBus in de user omgeving geconfigureerd is. Dit gebeurt dooreen zeker draaiend proces uit te lezen en de gegevens daarvan te gebruiken.In mijn geval is dat het proces 'lxsession'. In de voorbeelden die ik tegenkwam was het meestal gnome-session.
mijn test.sh ziet er nu als volgt uit:
#!/bin/bash


eval "export $(egrep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -u $LOGNAME lxsession)/environ)";

/usr/bin/notify-send "Dit is een testbericht" "Einde bericht"
echo "test.sh is running" >> /home/peer/test.txt
En het werkt. Elke minuut verschijnt er een mooie popup rechtsboven in het scherm.
De regel, die met 'eval' begint kwam ik op verschillende plaatsen en met kleine variaties op het net tegen

Nu ik zeker ben dat notify-send werkt zoals het hoort kan ik mijn Battery-Low-Monitor maken

Offline peer

  • Lid
  • Steunpunt: Nee
Re: srript wordt niet goed uitgevoerd in cron
« Reactie #9 Gepost op: 2019/05/13, 13:32:55 »
en mijn LowBatteryMonitor werkt :
Het scriptje kijkt eerst of de accu ontladen wordt (netadapter is niet aangesloten)
Dan kijkt het script of de accucapaciteit onder een grenswaarde is (hier 15%)
Als aan beide voorwaarden is voldaan dan wordt een melding gedaan.
In cron laat ik dit script elke 5 minuten draaien.
Hier is dit scriptje:
#!/bin/bash

battery_discharge=`acpi -b | fgrep -o 'Discharging'`
battery_level=`acpi -b | grep -P -o '[0-9]+(?=%)'`

if [ "$battery_discharge" = "Discharging" ]                 #controleer of accu ontlaadt
then
    if [ $battery_level -le 15 ]                            # controleer op minimum batterijinhoud
    then
                                                            # activeer Dbus voor notify-send
        eval "export $(egrep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -u $LOGNAME lxsession)/environ)";
        /usr/bin/notify-send "Battery low" "Battery level is ${battery_level}%!"   
    fi
fi