欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

起进程加载动态链接库冲突解决方案

程序员文章站 2022-05-28 11:16:23
...

冲突描述
情景,配置为用appdef启动相关进程,将一个进程拆成两个进程后,在做压力测试的时候有问题,同一个容器里面,加载同一个.so文件或者多个在很小的概率上会有冲突,因为进程启动先后不受控制。

问题的解决
在一个容器中启动多个进程
1.用同一个脚本启动,入参为启动的进程名,脚本中判断入参个数若为多个则循环启动。
2.然后调用子脚本,逐一启动进程。

注意点
使用&标识符即可在bash脚本中达到setdaemon的效果。

代码逻辑如下

#!/usr/bin/env bash
set -euo pipefail
readonly process_num="$#"
readonly script_path="$(readlink -f "$0")"
readonly script_dir="${script_path%/*}"
myLogger="logger -t start_cplane.sh"
export LD_LIBRARY_PATH=/opt/nokia/lib64/:$LD_LIBRARY_PATH
ldconfig
for ((i=1; i<=process_num; i++))
do
    if [ $i -ne $process_num ]; then
        ${script_dir}/cplane_process_run.sh ${!i} &
    else
        ${script_dir}/cplane_process_run.sh ${!i}
    fi
done

拓展
1.
$?表示上一条命令执行结果
s hell脚本中,判断方法为上一条执行成功,则$?为0,执行失败,则为1

2.set -o pipefail表示最近前一条管道命令,若真整个管道每条命令都执行成功,则返回值为0,反之,则返回值为1。
3.set -u遇到未定义的变量,报错并立即退出,
所谓的没有定义的变量,比如说就是尝试获取命令的第一个参数,然而并没有参数传入。

4.set -e: 当一个命令失败时,立即退出。如果你不想立即退出则可用‘|| true’
例子

#!/bin/bash
# there is no a.test,but have b.test
#set -E
#trap "echo ERR trap fired!" ERR
set -u
echo ${1}
set -o pipefail
cat a.test
echo $?
cat b.txt
echo $?

cat a.txt | echo "world"
echo $?
cat b.txt | echo "hi"
echo hello
echo $?

ref: https://blog.csdn.net/solinger/article/details/85317712