Mrli
别装作很努力,
因为结局不会陪你演戏。
Contacts:
QQ博客园

Shell代码编写记录

2021/11/03 Shell
Word count: 913 | Reading time: 4min

随机选取端口

1
2
3
4
5
# 随机设置代理和监控端口,允许每台机器有多个代理
# 注意:$RANDOM返回一个从0到32767的值,端口<= 1024保留给root用户
# TODO:不是随机选择端口,而是绑定到可用端口
export SPARK_SERVERPORT=$[$RANDOM + 1025]
export SPARK_AGENTPORT=$[$RANDOM + 1025]

后台执行,获取其PID

1
2
3
4
5
6
7
8
rcssserver3d --agent-port $SPARK_AGENTPORT --server-port $SPARK_SERVERPORT &
# 将rcssserver3d后台运行在随机获得的端口上
PID=$! # 获得进程号,最后用进程PID关闭rcssserver3d

# ---类比学习---
python ./test1.py &
PID=$!
echo $PID

组合命令

1
2
3
4
5
6
7
8
9
10
sleep 5	#延迟时间
DIR_SCRIPT="$( cd "$( dirname "$0" )" && pwd )"
# 先运行 cd切换目录,再将当前工作目录赋值给 DIR_SCRIPT
TYPE=$1 #TYPE为读取第二个参数
DIR_PARAMS="$( cd "$( dirname "$2" )" && pwd )"
DIR_OUTPUT="$( cd "$( dirname "$3" )" && pwd )"

PARAMS_FILE=$DIR_PARAMS/$(basename $2)
# basename返回文件名
OUTPUT_FILE=$DIR_OUTPUT/$(basename $3)

输出判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
while [ ! -f $OUTPUT_FILE ] && [ $total_wait_time -lt $maxWaitTimeSecs ]
do
sleep 1
total_wait_time=`expr $total_wait_time + 1`
# expr 表示后面是运算表达式
done
# -f 是正常文件
# Shell 中 ()用[]代替
if [ ! -f $OUTPUT_FILE ]
then
echo "Timed out while waiting for script to complete, current wait time is $total_wait_time seconds."
else
echo "Completed with a wait time of $total_wait_time seconds."
fi

关闭进程

1
2
3
4
5
echo "Killing Simulator"
kill -s 2 $PID
# kill -s 信号名 进程号
echo "Killing Agent"
kill -s 2 $AGENTPID

格式:kill <pid>

格式:kill -TERM <pid>

发送SIGTERM旌旗灯号到指定过程,若是过程没有捕获该旌旗灯号,则过程终止(If no signal is specified, the TERM signal is sent. The TERM signal will kill processes which do not catch this signal.)

格式:kill -l

列出所有旌旗灯号名称(Print a list of signal names. These are found in /usr/include/linux/signal.h)。只有第9种旌旗灯号(SIGKILL)才可以无前提终止过程,其他旌旗灯号过程都有权力忽视。下面是常用的旌旗灯号:

旌旗灯号名称

  • HUP 1 终端断线

  • INT 2 中断(同 Ctrl + C)

  • QUIT 3 退出(同 Ctrl + )

  • TERM 15 终止

  • KILL 9 强迫终止

  • CONT 18 持续(与STOP相反, fg/bg号令)

  • STOP 19 暂停(同 Ctrl + Z)

Bash Shell 脚本获取进程 pid

  • 第一种方法:

ps -ef | grep "Processname" | grep -v grep | awk '{print $2}'

  • 第二种

最简单的方法是使用 pgrep

pgrep -f name

根据PID关闭进程

kill -9 PID

根据进程名关闭进程

法一:

1
kill -f name1

法二:

如果是可执行程序的话,可以直接使用 pidof

1
pidof name

关闭Roboviz.sh里java进程的方法:

grep -v :显示不包含匹配文本的所有行(反向查找)。比如 grep -v grep 就是查找不含有 grep 字段的行

写法一:kill -9 $(ps x | grep Roboviz.jar | grep -v grep | awk '{print $1}')

写法二: ps -ef | grep Roboviz.jar | grep -v grep | awk '{print $2}' | xargs kill -9

shell脚本中的冒号作用

作用一: 占位符<==>pass

1
2
3
4
5
if egrep '.*vmlinuz-2.6.32-220.23.1.lvs.el6.*nohz=off' /boot/grub/grub.conf ;then 
:
else
sed -i -r 's/(.*vmlinuz-2.6.32-220.23.1.lvs.el6.*)/\1 nohz=off/' /boot/grub/grub.conf
fi

作用二: 分隔符

冒号(:)常用来做路径的分隔符(PATH),数据字段的分隔符(/etc/passwd)

特殊变量:

  • PID 当前脚本PID

  • $? 上句执行结果

command -v用法

Linux中,command -v 可以判断一个命令是否支持,如果一个脚本需要,或者还要家if判断,则示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
# 判断是否存在docker
if command -v docker >/dev/null 2>&1;then
echo "yes"
else
echo "no"
fi

# 实际运用:如果不存在unzip则报错
if ! command -v unzip >/dev/null; then
echo "Error: unzip is required to install ipgw." 1>&2
exit 1
fi

Author: Mrli

Link: https://nymrli.top/2019/01/23/Shell代码编写记录/

Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.

< PreviousPost
C++日期操作
NextPost >
Matlab基础教程
CATALOG
  1. 1. 随机选取端口
  2. 2. 后台执行,获取其PID
  3. 3. 组合命令
  4. 4. 输出判断
  5. 5. 关闭进程
    1. 5.1. 旌旗灯号名称
  6. 6. Bash Shell 脚本获取进程 pid
    1. 6.1. 根据PID关闭进程
    2. 6.2. 根据进程名关闭进程
    3. 6.3. 关闭Roboviz.sh里java进程的方法:
  7. 7. shell脚本中的冒号作用
    1. 7.1. 作用一: 占位符<==>pass
    2. 7.2. 作用二: 分隔符
  8. 8.
    1. 8.1. 特殊变量:
  9. 9. command -v用法