shell终端下执行多个py文件

该博客介绍了如何使用Linux shell脚本来执行单个或多个Python文件。对于单个文件执行,脚本会检查进程是否存在,若不存在则启动;对于多个文件,提供了顺序执行和多进程并行执行的方式。同时,文章还提到了Windows文件上传到Linux后可能出现的换行符问题及其解决方案。最后,讲解了如何将脚本输出重定向到日志文件以便于监控。
摘要由CSDN通过智能技术生成

1 执行单个py文件

修改python_path为自己的python安装路径
修改cd的路径

#!/bin/bash
python_path="/usr/local/bin/python3"
# "statistic.py"
files=("test.py")
start() {
  cd /public/home/data/
  
  for i in ${files[*]}; do
    pid=$(ps aux | grep python | grep "${i}" |grep -v grep| awk '{print $2}')
    if [ ! "$pid" ]; then
      ${python_path} "${i}" &
    else
    echo "${i} Started!"
    fi
  done
 
}
stop() {
  pids=()
  pid=$(ps aux | grep uvicorn|grep -v grep | awk '{print $2}')
  pids[${#pids[@]}]=$pid
  pid=$(ps aux | grep multiprocessing |grep -v grep | awk '{print $2}')
  pids[${#pids[@]}]=$pid
  pid=$(ps aux | grep main|grep -v grep | awk '{print $2}')
  pids[${#pids[@]}]=$pid


  for i in ${files[*]}; do
    pid=$(ps aux | grep python | grep "${i}"|grep -v grep | awk '{print $2}')
    if [ ! "$pid" ]; then
      echo "${i} Stopped!"
    else
      pids[${#pids[@]}]=$pid
    fi
  done
  for p in ${pids[*]}; do
    kill -9 "${p}"
    echo "${p} closed"
  done
}
restart() {
  stop
  start
}
#main function
case $1 in
start)
  start
  ;;
stop)
  stop
  ;;
restart)
  restart
  ;;
esac

2 执行多个py文件

2.1 顺序执行

修改cd的路径

#!/bin/bash

cd /public/home/data/test/
python3 test1.py
python3 test2.py
python3 test3.py
python3 test4.py
python3 test5.py
python3 test6.py

!若从windows上传至liunx服务器,shell脚本执行报错:/bin/bash^M: bad interpreter: No such file or directory
原因:windows环境下的文件是dos格式,每行结尾以\r\n来标识;而linux下的文件是unix格式,行尾则以\n来标识。

查看文件
1.cat -A test.sh
输出结果中行末尾是^M, 则 是dos格 式 ,如果行末尾只是,则是unix格式。
2.vim test.sh,执行“:set ff”,若执行结果为fileformat=dos则为dos格式,若执行结果为fileformat=unix则为unix格式

解决方法:
1.sed -i “s/\r//” test.sh 或sed -i “s/^M//” test.sh,直接将回车符替换为空字符串。
2.vim test.sh,执行“: set ff=unix”,将文件设置为unix格式,保存退出。

2.2 多进程执行

修改python_path为自己的python安装路径
修改cd的路径

#!/bin/bash
python_path="/usr/local/bin/python3"  
# "statistic.py"
cd /public/home/data/test/

start() {
  for dir in $(ls ./); 
  do
    pid=$(ps aux | grep python | grep "${dir}" |grep -v grep| awk '{print $2}')
	echo "${pid} Started!"
    if [ ! "$pid" ]; then
      ${python_path} "${dir}" &
    else
    echo "${dir} Started!"
    fi
  done
 
}
stop() {
  pids=()
  pid=$(ps aux | grep uvicorn|grep -v grep | awk '{print $2}')
  pids[${#pids[@]}]=$pid
  pid=$(ps aux | grep multiprocessing |grep -v grep | awk '{print $2}')
  pids[${#pids[@]}]=$pid
  pid=$(ps aux | grep main|grep -v grep | awk '{print $2}')
  pids[${#pids[@]}]=$pid


  for dir in $(ls ./); do
    pid=$(ps aux | grep python | grep "${i}"|grep -v grep | awk '{print $2}')
    if [ ! "$pid" ]; then
      echo "${dir} Stopped!"
    else
      pids[${#pids[@]}]=$pid
    fi
  done
  for p in ${pids[*]}; do
    kill -9 "${p}"
    echo "${p} closed"
  done
}
restart() {
  stop
  start
}
#main function
case $1 in
start)
  start
  ;;
stop)
  stop
  ;;
restart)
  restart
  ;;
esac

注:若想将脚本的执行过程及执行结果打印到日志,执行

./run.sh restart 2>&1 |tee -a mylog.log

run.sh为执行脚本,mylog.log为日志文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值