Electron集成其他桌面程序时记录登录账号

最近在实现Electron编写一个桌面程序,集成医院his系统,在his中通过调取已经装好的Electron exe程序,调取Electron exe程序时需要参入参数(登录账号信息),可通过以下命令获得参数:

process.argv
 
但是每次his重新加载后调起后,可能多次调起Electron exe程序,需要kill前面的程序,保证只起一个程序
解决方法:
每次启动程序后写入一个文件,记录当前账号以及进程id
启动程序时去读取当前文件,如果判断到账号未修改则退出新启动的exe程序
自动更新时,会重新启动程序,次数的参数会变为“--updated”,也需要从文件中获取,实现自动登录
具体代码如下,需要在写入启动文件中:
import { app, BrowserWindow, ipcMain, shell } from 'electron'
import path from "path"
import fs from "fs"
// 查找之前是否有进程,并杀掉
import childProcess from 'child_process'
const exec = childProcess.exec

const killProcess = (pid) => {
    let cmd = process.platform === 'win32' ? 'tasklist' : 'ps aux'
    exec(cmd, function (err, stdout, stderr) {
      if (err) {
        return console.error(err)
      }
      const lines = stdout.split('\n');
      for(let line of lines){
        const processMessage = line.trim().split(/\s+/)
        if(processMessage[0].startsWith('xiaobao')) console.log(processMessage, 'pidpidpid1')
        if(processMessage[1] == pid){
          console.log(pid, 'find kill')
        //   process.kill(pid)
          break;
        }
      }
    })
}

const findProcess = (pid, cb) => {
    let cmd = process.platform === 'win32' ? 'tasklist' : 'ps aux'
    exec(cmd, function (err, stdout, stderr) {
      if (err) {
        return console.error(err)
      }
      let re = null;
      const lines = stdout.split('\n');
      for(let line of lines){
        const processMessage = line.trim().split(/\s+/)
        if(processMessage[1] == pid){
          console.log(processMessage[1], 'sssss');
          re = processMessage;
          break;
        }
      }
      cb(re)
    })
}

const writeFile=(path, data)=>{
    fs.writeFile(path, JSON.stringify(data),(err) => {
        if (err) {
            throw err;
        }
        console.log(err);
    });
}

const bootApp =()=>{
    let user = process.argv[process.argv.length - 1];
    const logsPath = path.join(app.getAppPath(), '../../../') + '/logs';
    // 判断是否重新启动小宝
    fs.exists(logsPath, (exists)=> {
      if(exists){
        // 读取文件
        fs.readFile(logsPath, function (err, data) {
            if (err) {
                return console.error(err);
            }
            let logsInfo = {}
            try{
              logsInfo = JSON.parse(data.toString());
            }catch(e){
              console.log(e);
            }
            // 判断是否存在进程,或者通过别的渠道将进程已经关闭
            findProcess(logsInfo.pid,(data)=>{
                // 如果存在进程
                if(data){
                  // 如果账户不相同,则关闭前面进程,重新启动
                    if(logsInfo.user !== user){
                        console.log('user changed, kill old pro and write new info', user, logsInfo.pid);
                        if(user === '--updated'){
                          console.log('auto update, user not change', logsInfo.user);
                          global.arguments.push(logsInfo.user)
                          user = logsInfo.user
                        }
                        writeFile(logsPath, {
                            user, 
                            pid: process.pid
                        });
                        process.kill(logsInfo.pid)
                    }else{
                        // 否则退出当前程序
                        console.log('same user, app quit')
                        app.quit()
                    }
                }else{
                    // 如果进程不存在需要写入新起的进程数据
                    console.log('process not exit, write info');
                    // 如果判断是自动更新时,自动更新的参数为‘--updated’
                    if(user === '--updated'){
                      console.log('auto update, user not change', logsInfo.user);
                      global.arguments.push(logsInfo.user)
                      user = logsInfo.user
                    }
                    writeFile(logsPath, {
                        user, 
                        pid: process.pid
                    });
                }
            })
        });
      }else{
        // 不存在文件写文件
        writeFile(logsPath, {
            user, 
            pid: process.pid
        });
      }
    })
}


export {
    killProcess,
    findProcess,
    bootApp
}

在main.dev.js中引入

if (process.env.NODE_ENV === 'production') {
  const sourceMapSupport = require('source-map-support');
  sourceMapSupport.install();
  const proSetting = require('./prod.setting.js');
  proSetting.bootApp();
}

注意:写入的文件要在安装程序路径上级,否则会被重新安装以后覆盖,这样无法做到自动更新时实现自动登录

 

posted @ 2019-08-09 15:06  纸鸢&红豆·绿豆  阅读(1360)  评论(0编辑  收藏  举报