Home > OS >  Cron, execute bash script as root, but one part (Python script) as user
Cron, execute bash script as root, but one part (Python script) as user

Time:12-15

I need to run a bash script periodically on a Jetson Nano (so, Ubuntu 18.04). The script should run system updates, pull some Python code from a repository, and run it as a specified user. So, I created this script:

#! /bin/bash

## system updates
sudo apt update
sudo apt upgrade

## stop previous instances of the Python code
pkill python3

## move to python script folder
cd /home/user_name/projects/my_folder

## pull updates from repo
git stash
git pull

## create dummy folder to check bash script execution to this point
sudo -u user_name mkdir /home/user_name/projects/dummy_folder_00

## launch python script
sudo -u user_name /usr/bin/python3 python_script.py --arg01 --arg02

## create dummy folder to check bash script execution to this point
sudo -u user_name mkdir /home/user_name/projects/dummy_folder_01

I created a cron job running this script as root, by using

sudo crontab -e

and adding the entry

00 13 * * * /home/user_name/projects/my_folder/script.sh

Now, I can see that at the configured time, both the dummy folders are created, and they actually belong to user_name. However, the Python script isn't launched.

I tried creating the cron job as non root user (crontab -e), but at this point even if the Python script gets exectured, I guess I wouldn't be able to run apt update/upgrade. How can I fix this?

CodePudding user response:

Well, if the dummy folders did get created, that means the sudo statements work, so i'd say theres a 99% chance that python was infact started.

I'm guessing the problem is that you havent specified the path for the python file, and your working directory likely isn't what you're expecting it to be.

change:

sudo -u user_name /usr/bin/python3 python_script.py --arg01 --arg02

to something like

sudo -u user_name /usr/bin/python3 /path/to/your/python_script.py --arg01 --arg02

then test.

If that didn't solve the problem , then enable some logging, change the line to:

sudo -u user_name /usr/bin/python3 /path/to/your/python_script.py --arg01 --arg02 \
1> /home/user_name/projects/dummy_folder_00/log.txt 2>&1 ;

and test again, it should log STDOUT and STDERR to that file then.

  • Related