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

  • 相关阅读:
    每日一题 为了工作 2020 0412 第四十一题
    每日一题 为了工作 2020 04011 第四十题
    每日一题 为了工作 2020 0410 第三十九题
    每日一题 为了工作 2020 0409 第三十八题
    每日一题 为了工作 2020 0408 第三十七题
    每日一题 为了工作 2020 0407 第三十六题
    每日一题 为了工作 2020 0406 第三十五题
    每日一题 为了工作 2020 0405 第三十四题
    学习总结(二十四)
    学习总结(二十三)
  • 原文地址:https://www.cnblogs.com/goto2091/p/13682261.html
Copyright © 2011-2022 走看看