使用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时间类型
参考文档: https://www.cnblogs.com/phpfensi/p/8143307.html
mysql存储时间通常选择这四种类型:datetime、timestamp、int和bigint四种方式,常用的是datetime和int两种,int类型查询效率高,但由于目前mysql性能越来越好,datetime类型相比int类型的查询效率差不多,并且可读性更强。 - mysql中FROM_UNIXTIME()和UNIX_TIMESTAMP()函数
参考文档: https://blog.csdn.net/qq_38928944/article/details/83058390
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子进程中第一次引用父进程的变量后,后面父进程对该变量值的修改无法影响到子进程
这是因为:当子进程第一次引用父进程的变量会在自己的内存空间存放这个变量的值,所以父进程的变量变化对其是没有任何影响的
- sh filename 重新建立一个子shell,在子shell中执行脚本里面的语句,该子shell继承父shell的环境变量(用export定义的变量),但子shell新建的、改变的变量不会被带回父shell
- source filename 这个命令其实只是简单地读取脚本里面的语句依次在当前shell里面执行,没有建立新的子shell。那么脚本里面所有新建、改变变量的语句都会保存在当前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 ] ,即想通过父进程的变量修改来更改子进程的状态,它无法做到的
网友评论