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脚本)以用户身份执行的主要内容,如果未能解决你的问题,请参考以下文章