zoukankan      html  css  js  c++  java
  • Caterpillar的启动以及自动化启动脚本

    Caterpillar的启动以及自动化启动脚本

    Caterpillar是基于以太坊的BPMS,建模的BPMN图形可被Caterpillar转化为solidity程序部署到以太坊中。
    Caterpillar分为Caterpillar Core和 execute panel,启动时需要其他进程的支持。如果每次手动启动则很麻烦,因此,使用python脚本进行快速启动。

    制作自动化脚本的目的是快速启动Caterpillar,以及后续对Caterpillar代码生成的中间过程进行处理。

    首先必须启动Caterpillar core,在运行它之前,必须安装 gulp-cli,
    进入Caterpillar core的目录后,执行以下指令:

    npm install 
    gulp build
    
    # 完成后运行
    gulp
    

    注意

    运行Core之前必须打开 mongodb以及Ganache cli,
    mongodb的打开方式为:

    # sudo mongod
    

    Ganache cli是以太坊测试节点。启动ganache cli

    #ganache-cli
    

    启动执行面板

    初始的时候npm install
    然后执行 ng serve
    通过本地端口4200打开。

    编写脚本使各组件自动后台运行。

    每次分别启动组件非常麻烦,不如将它们放入后台运行。
    后台运行ganache-cli的方法是
    nohup ganache-cli &>log &,这样ganache-cli运行时候的日志就会输出到log文件中。
    执行该指令后会返回ganache-cli的进程id。
    如果想结束,则通过进程号关闭进程。

    python中如何使用nohup指令?

    直接对python脚本执行nohup 指令是可以的。
    例如nohup ./init_run.py &>log & 执行后,生成的log仍然是ganache-cli的log ,
    查看其返回的进程号859可以看到:

    ics        859   632  0 22:39 tty3     00:00:00 /usr/bin/python3 ./init_run.py
    ics        860   859  7 22:39 tty3     00:00:04 node /usr/local/bin/ganache-cli
    ics        891   632  0 22:40 tty3     00:00:00 grep --color=auto 859
    

    859进程是python脚本,而860是859的子进程。该子进程运行着ganache-cli。
    这样做固然达到了ganache-cli后台挂起的效果,但是可不可以直接执行py脚本就能做到呢?
    即用subprocess达到后台调用的效果。

    如果用os.system直接执行的话固然可以,但是它无法返回进程uid.
    如果要返回进程uid必须采用subprocess方法。

    import subprocess
    proc = subprocess.Popen(' ganache-cli ', shell=true)
    print(proc.pid) #可得到id号
    

    这里要注意,如果是单纯的ganache-cli,返回的id就是其进程号
    但如果是下面这样,返回的进程号便是nohup的,而nohup在完成后会自动消失,所以这里的ganache-cli进程号是pid+1.

    import subprocess
    proc = subprocess.Popen('nohup ganache-cli &>log & ', shell=true)
    print(proc.pid) #可得到id号
    

    注意,subprocess.Popen中的 &>log简写会失效。 写成原来的, >log 2>&1
    https://www.pynote.net/archives/2088

    python杀掉所有进程的脚本

    由于都是后台运行,所以每次杀后台脚本非常麻烦,这里写一个杀掉全部后台的脚本。原理仍然是通过grep 筛选出所有相关进程号。

    #!/usr/bin/python3
    
    import subprocess
    def mycmd(str):
        subprocess.Popen(str,shell=True)
    
    def deleteproc(processName):
        return 'ps -ef | grep '+processName+' | grep -v grep | cut -c 9-15 | xargs kill -s 9'
    
    if __name__ == "__main__":
        subprocess.Popen(deleteproc('ganache-cli'), shell=True)
        subprocess.Popen(deleteproc('mongod'),shell=True)
    

    kill -s 9 进程号
    该指令可以强制杀掉进程。-s 9 将信号9传递给进程,该信号意为立即终止进程。
    根据程序名杀进程
    pkill 进程名
    killall 进程名
    但是根据进程名杀进程有时候并不管用。
    根据进程号杀进程是最有效的。只要我们找到该进程名的所有进程id,然后批量杀掉这些id,就可以杀掉进程。

    ps -ef | grep ganache-cli | grep -v grep | cut -c 9-15 | xargs kill -s 9
    

    该指令便可以删除全部的ganache-cli进程。
    grep -v grep 过滤了grep进程, cut -c 9-15是截取输入行的第9个字符到第15个字符。是进程ID
    xargs命令将前面得到的结果作为参数。

    简化版本:使用后没有效果,看来最保险的还是上面的指令。
    pgrep ganache-cli | xargs kill -s 9 # pgrep直接返回id号
    kill -s 9 'pgrep ganache-cli'

    杀进程非常全的教程。 https://www.cnblogs.com/apolloren/p/9979328.html
    https://www.cnblogs.com/huminxxl/p/4151367.html
    https://www.cnblogs.com/jins-note/p/9636969.html

    python执行shell命令的常用方法

    1.调用os.system方法

    import os
    cmd = os.system('ls -al')
    #print(cmd) #返回状态码,失败是1
    

    os.system方法会直接调用系统命令。
    2. os.popen()方法

    os.popen(command[,mode[,bufsize]])
    # command是指令
    # mode是模式权限
    # bufsize指明了文件需要的缓冲大小。
    # 例如,使用mkdir命令
    
    #!/usr/bin/python
    #-*- coding: utf-8 -*-
    import os 
    a = 'mkdir newdir'
    b = os.popen(a, 'r',1) # 
    print(b) # 返回系统的值
    

    3.subprocess

    p = subprocess.run(['mkdir','anotherdir'])
    

    subprocess是目前常用的方式。

    https://www.cnblogs.com/wqbin/p/11759396.html

    linux查询命令所在路径

    例如,我想知道python3所在的路径,使用whereis指令

    whereis python3
    

    linux 使程序在后台运行的方法

    # 后台执行程序
    nohup python xxx.py >> run.log 2>&1 &
    

    nohup是挂起的意思, 将进程放置于后台运行,并且把输出定向到run.log中
    2 > &1的意思是?
    1是标准输出
    2是stderr
    0是stdin 即标准输入.

    >是覆盖式重定向,而>>是追加式重定向。
    >&是一个整体,不可分开。所以, 2>&1 的意思就是 把标准错误向标准输出中定向。
    最后一个&的意思是将该条命令放到后台执行。

    1.本来1指向屏幕。 这里的1就是程序将会输出的标准输出,终端屏幕。
    2. 执行 > log后, 1指向了log
    3. 2>&1 , 2--->1  2指向了1,因此2也指向了log
    

    如果 2>&1放到中间会如何?
    放到中间的话, 2指向了1之前指向的屏幕,但是1后来指向了log.
    因此,会造成两者不一致。
    如何简写呢?
    &>log或者>&log 这样便可以代替 >log 2>&1.

    参考资料

    https://blog.csdn.net/zhaominpro/article/details/82630528

    https://www.cnblogs.com/zhenghongxin/p/7029173.html

    https://www.cnblogs.com/andylhc/p/9721705.html

  • 相关阅读:
    vue中使用better-scroll实现滑动效果
    better-scroll一个好用的页面滑动工具
    display:table和display:table-cell结合使用
    大小图片
    axios的使用
    vue中两种路由跳转拼接参数
    Android 核心分析 之七Service深入分析
    Android 核心分析 之六 IPC框架分析 Binder,Service,Service manager
    Android 核心分析 之五基本空间划分
    Android核心分析之四手机的软件形态
  • 原文地址:https://www.cnblogs.com/goto2091/p/13682261.html
Copyright © 2011-2022 走看看