Cron,以root身份执行bash脚本,但一部分(Python脚本)以用户身份执行

Posted

技术标签:

【中文标题】Cron,以root身份执行bash脚本,但一部分(Python脚本)以用户身份执行【英文标题】:Cron, execute bash script as root, but one part (Python script) as user 【发布时间】:2022-01-17 18:28:24 【问题描述】:

我需要在 Jetson Nano(比如 Ubuntu 18.04)上定期运行 bash 脚本。该脚本应该运行系统更新,从存储库中提取一些 Python 代码,并以指定用户身份运行它。 所以,我创建了这个脚本:

#! /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

我创建了一个以 root 身份运行此脚本的 cron 作业,使用

sudo crontab -e

并添加条目

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

现在,我可以看到,在配置的时间,两个虚拟文件夹都已创建,它们实际上属于 user_name。但是,Python 脚本并未启动。

我尝试以非 root 用户 (crontab -e) 创建 cron 作业,但此时即使 Python 脚本被执行,我想我也无法运行 apt update/upgrade。 我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

好吧,如果确实创建了虚拟文件夹,这意味着 sudo 语句有效,所以我会说有 99% 以上的机会实际上启动了 python。

我猜问题是你没有指定 python 文件的路径,你的工作目录可能不是你期望的。

改变:

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

类似

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

然后测试。

如果这不能解决问题,则启用一些日志记录,将行更改为:

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 ;

然后再次测试,它应该将 STDOUT 和 STDERR 记录到该文件中。

【讨论】:

感谢您的回复!在运行 python 代码之前,我正在从 bash 脚本更改工作目录(cd /home/user_name/projects/my_folder),所以我想这不应该是问题。另外,正如我所说,我尝试以非 root 用户身份创建 cron 作业,一切正常。 是的,但以userX 运行它与运行sudo -u userX 的root 用户并不完全相同,存在一些细微的差异(可能重要也可能不重要);我会检查日志文件的内容。 是的,这似乎是问题所在,像这样运行 Python 脚本会在导入的 Python 包中产生一些问题。我将以非 root 身份运行此脚本,并将系统更新保留在另一个 cron 作业中,谢谢!

以上是关于Cron,以root身份执行bash脚本,但一部分(Python脚本)以用户身份执行的主要内容,如果未能解决你的问题,请参考以下文章

即使以 root 身份也无法执行 bash 脚本?

以root身份在脚本中间运行命令[重复]

以 root 身份运行结构脚本

通过 ADB 以 root 身份启动脚本

从 root 帐户执行 cron 作业是不是安全?

Bash 脚本未在 Cron 中正确执行