Bash-script mislukt wanneer het via cron wordt uitgevoerd, kan Libboost-bibliotheek niet vinden

Ik gebruik een bash-script dat libboost gebruikt om een ​​statistisch model in het geheugen te houden. Wanneer ik het script rechtstreeks vanaf de opdrachtregel uitvoer (bijvoorbeeld: # /pylda/exec-test.sh), werkt het prima. Wanneer het echter op de cron-taak wordt uitgevoerd, krijg ik de volgende foutmelding:

"/root/pylda/src/infer: error while loading shared libraries: libboost_program_options.so.1.46.1: cannot open shared object file: No such file or directory"

Hoe gedraagt ​​cron zich anders? Is er een omgevingsvariabele die moet worden ingesteld? Dit is cron als root, voor zover ik weet.

Bedankt

0

4 antwoord

Controleer uw omgevingsvariabele LD_LIBRARY_PATH ?

2
toegevoegd

Als algemene opmerking, vertrouw niet op de aanwezigheid van omgevingsvariabelen die u normaal gesproken hebt tijdens een interactieve (login) sessie wanneer u cron() een script gebruikt. Sommige implementaties definiëren alleen een minimale omgeving. Je doet er goed aan om alles wat je nodig hebt in je script op te nemen, hetzij door directe verklaring daarin, hetzij door een bestand met de variabelen die je nodig hebt erin te zoeken.

1
toegevoegd

Zelfs als dit oud is, denk ik dat dit antwoord anderen kan helpen.

Hier een voorbeeld regel van mijn crontab:

0 3 * * 1,2,4,5,6 (. /home/oracle/.profile; export ORACLE_SID=myDB;. myscript.ksh parm1 parm2; ) 1>/dev/null 2>&1

Which: Execute the profile of my user (oracle), so I am sure I have the good envs:. /home/oracle/.profile Set a local env value: export ORACLE_SID=myDB Executes the script with its params:. myscript.ksh parm1 parm2 (nota: the dot because the script does not have the x flag) Does not send email: 1>/dev/null 2>&1 (My script sends the needed emails with formatting).

Gebruik() om een ​​lijst met opdrachten te omsluiten, en puntkomma (;) om opdrachten te scheiden.

In de hoop dat dit kan helpen ...

1
toegevoegd

Probeer de PATH var op Cron-script in te stellen

# /etc/cron.d/something
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
0
toegevoegd
Het opgegeven antwoord @ michael-krelin-hacker is nauwkeuriger, u moet LD_LIBRARY_PATH instellen, maar toch moet u dat in uw Cron-script doen. U moet uw huidige LD_LIBRARY_PATH controleren met 'env'.
toegevoegd de auteur 0xd, de bron
Vergeef mijn gebrek aan kennis hierover - is er een pad dat specifiek is voor een CentOS-installatie?
toegevoegd de auteur Russ, de bron