[英]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.