linux日常使用问题3

2019-11-05  本文已影响0人  狗狗胖妞

使用expect自动登录后,不能使用rz和sz命令问题

参考文档: https://blog.csdn.net/lovewebeye/article/details/85049423

将本地的LC_CTYPE环境变量设置成en_US,这样再用expect脚本自动登录,登录成功就可以使用rz 和sz传输文件了

export LC_CTYPE=en_US
# python设置环境变量
import os
os.environ['LC_CTYPE'] = 'en_US'

fork: Cannot allocate memory 问题的处理

问题现象: 无法ssh到服务器,最后重启了服务器再登录服务器查看日志,在secure日志文件下发现 sshd[1873]: error: fork: Cannot allocate memory报错,在message日志文件下发现 expire_proc: expire thread create for /net failed, expire_proc: expire thread create for /misc failed等报错

原因是线程数满了,超过了系统设置的默认值
有一个java程序有问题,创建线程过多

修改系统最大线程数:

#修改最大进程数后系统即可恢复,无需重启进程。
echo 1000000 > /proc/sys/kernel/pid_max

#永久生效
echo "kernel.pid_max=1000000 " >> /etc/sysctl.conf
sysctl -p

对于这种问题,应该主要去检查系统上运行的程序是否有问题,而不轻易需要修改默认的参数。


mysql时间

mysql> select UNIX_TIMESTAMP('2017-11-29');
+------------------------------+
| UNIX_TIMESTAMP('2017-11-29') |
+------------------------------+
|                   1511931600 |
+------------------------------+
1 row in set (0.04 sec)

mysql> select FROM_UNIXTIME('1511931600','%Y-%m-%d');
+----------------------------------------+
| FROM_UNIXTIME('1511931600','%Y-%m-%d') |
+----------------------------------------+
| 2017-11-29                             |
+----------------------------------------+
1 row in set (0.01 sec)

export和source

export修饰的变量在当前进程及其子进程中有效
source执行过的脚本,会将脚本中定义的变量放在当前进程中

参考文档: https://blog.csdn.net/qq_30038111/article/details/79887419

深度思考 ==>
export命令将使系统在创建每一个新的shell时定义这个变量的一个拷贝:

[jinbo@k8s-node0 ~]$ cat test 
while :
do
    sleep 2
    echo $a >> /tmp/aa
done
[jinbo@k8s-node0 ~]$ 
[jinbo@k8s-node0 ~]$ export a=3
[jinbo@k8s-node0 ~]$ ./test &
[1] 55318
[jinbo@k8s-node0 ~]$ tail -f /tmp/aa 
3
3
3
3
3
3
^C
[jinbo@k8s-node0 ~]$ a=4
[jinbo@k8s-node0 ~]$ tail -f /tmp/aa 
3
3
3
3
3
3
3
3
3
3
3

shell子进程中第一次引用父进程的变量后,后面父进程对该变量值的修改无法影响到子进程
这是因为:当子进程第一次引用父进程的变量会在自己的内存空间存放这个变量的值,所以父进程的变量变化对其是没有任何影响的

一个监控docker容器资源使用的小脚本:

#!/bin/bash

filename=/tmp/.tmp_file
if [ -e $filename ];then                
   echo "Other instance is running!" 
   exit 0          
fi

trap "rm -f $filename;exit" 0 1 2 3 9 15

get_stats() {
touch /tmp/.a
{
while [ "`cat /tmp/.a`" != q ]       #通过读取文件的内容判断循环是否继续
do
        docker stats --no-stream | awk 'NR>1' >> $filename
done 
} &

while :
do
echo -ne "输入q退出测试:"
read input
#export input
if [ "$input" = q ];then
    break
else
    echo "只能输入q退出"
fi
done

echo $input > /tmp/.a

wait
rm /tmp/.a

id_str=`awk '{print $1}' $filename | sort -u`

for id in `echo $id_str`
do
    echo "CPU使用最高:"
        grep "^$id" $filename | sort -nrk 3 | head -n 1
    echo "内存使用最高:"
        grep "^$id" $filename | sort -nrk 4 | head -n 1
    echo "-------------------------------------------"
done

rm $filename

}

while :
do
while :
do
echo -ne "输入 start 开始测试:"
read choice
if [ "$choice" = start ];then
    break
else
    echo "你的输入有问题,请重新输入"
fi
done

echo -ne "正在监测... , "
get_stats
done

while [ "cat /tmp/.a" != q ] , 这个地方之前犯的错误是判断父进程的输入变量的值来结束这个循环 while [ "$input" != q ] ,即想通过父进程的变量修改来更改子进程的状态,它无法做到的

上一篇 下一篇

猜你喜欢

热点阅读