Calling to restart a "service" in Linux from Python script not working from within crontab entry
Solution 1
It turns out that it is indeed path related.
Path Information for Cronjobs
Commands in submodules
To solve it I provided the following entries via crontab -e
[root@lb1 ~]# crontab -l
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
Now my service restarts as expected. Yay!
Solution 2
In subprocess set shell=True
subprocess.call(command, shell=True)
I think your problem will be solved but sudo problem may be arised.
Al Sweetman
Long-term Java and Grails developer with a passion for neat, clean and tidy code.
Updated on June 23, 2022Comments
-
Al Sweetman almost 2 years
I have the following python test script (extracted from a much bigger .py file) which I'm trying to get working on an EC2 instance (haproxy OpsWorks instance).
There seems to be a major difference between the permissions applied when running as a cron entry versus running as a python script from the shell.
The closest I've found in any other posts is here but that's relating to shell scripts and, given that I'm running python OK, the paths should ( I hope ) be sufficiently configured for the cronjob.
Environment: - Python version: 2.6.8 - Environment: OpsWorks HAProxy instance, on EC2. - Running as user: root.
Script
import subprocess import boto import logging if __name__ == '__main__': logging.getLogger().setLevel(boto.logging.INFO) command = ['service', 'haproxy', 'reload']; logging.info('Executing: %s' % command) #shell=FALSE for sudo to work. subprocess.call(command, shell=False)
I have alternatively tried calling the subprocess command using the following to no avail.
# subprocess.call("%s %s %s %s" % ('sudo', 'service', 'haproxy', 'reload'))
Output when run from the command line:
[root@lb1 ~]# python tester.py INFO:root:Executing: ['service', 'haproxy', 'reload'] Reloading haproxy: [root@lb1 ~]#
Crontab entry:
[root@lb1 ~]# crontab -l */1 * * * * python ~/tester.py > ~/testlog 2>&1
Output when run as a crontab command
[root@lb1 ~]# cat testlog INFO:root:Executing: ['service', 'haproxy', 'reload'] Traceback (most recent call last): File "/root/tester.py", line 13, in <module> subprocess.call(command, shell=False) File "/usr/lib64/python2.6/subprocess.py", line 478, in call p = Popen(*popenargs, **kwargs) File "/usr/lib64/python2.6/subprocess.py", line 639, in __init__ errread, errwrite) File "/usr/lib64/python2.6/subprocess.py", line 1228, in _execute_child raise child_exception OSError: [Errno 2] No such file or directory
I'm confused as to why on earth it's throwing the "No Such File Or Directory" error!
Can anyone provide any pointers? Incidentally this is part of a much bigger EC2 integration piece - hence the boto import [it's a nice way to get logging in this instance]. It's running as root because, from browsing SO, it's bad practice to have a cron entry for a user account running with a sudo command.
Cheers,