簡體   English   中英

Cron 激活 virtualenv 並從 shell 腳本運行多個 python 腳本

[英]Cron activate virtualenv and run multiple python scripts from shell script

我需要一個 cron 來運行單個 shell 腳本。 這個 shell 腳本應該激活 python virtualenv 然后執行 python 腳本。 這是我的計划:

0 0 * * 1 /home/ubuntu/crontab_weekly.sh

這是我的 crontab_weekly.sh 文件:

cd /home/ubuntu/virtualenvironment/scripts \
&& source /home/ubuntu/venv3.8/bin/activate \
&& python script1.py \
& python script2.py \
& python script3.py \
& python script4.py \

想法是進入托管腳本的目錄,然后激活 venv,然后才開始執行腳本。 腳本應該並行執行。 但在我的例子中,只執行了script1.py而沒有執行以下腳本。 我的問題在哪里?

請記住&意味着異步運行整個先前的命令。 這包括&&之前的任何內容。 異步運行的命令在單獨的進程中運行。

舉一個簡化的問題示例,假設我們異步更改目錄,運行pwd ,然后再次異步運行pwd

#!/bin/sh

cd / && \
pwd \
& pwd

在我的電腦上,輸出:

/home/nick
/

cd /旨在影響兩個pwd調用,但它只影響第一個,因為第二個在不同的進程中運行。 (在這種情況下,他們也打印錯了,第二個在前。)

那么,如何以更健壯的方式編寫此腳本呢?

首先,我會使用-e打開嚴格的錯誤處理。 一旦任何(非異步)命令返回非零退出代碼,它就會退出。 其次,我會避免使用&& ,因為嚴格的錯誤處理會解決這個問題。 第三,我會在最后使用wait來確保在所有子腳本退出之前腳本不會退出。

#!/bin/sh
set -e

cd /

pwd &
pwd &

wait

一般的想法是您打開嚴格的錯誤處理,以同步方式完成所有設置,然后異步啟動您的四個腳本,並等待所有腳本完成。

將其應用於您的程序:

#!/bin/sh
set -e
cd /home/ubuntu/virtualenvironment/scripts
source /home/ubuntu/venv3.8/bin/activate

python script1.py &
python script2.py &
python script3.py &
python script4.py &

wait

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM