Linux检测当前除系统进程外的业务进程及其工作路径
1. 运行结果查看:
当前路径下: check_server_file.result
格式:
ALL_CNT: [所有进程数]
NOW_ID: [当前进程数]
FILEPATH: 工作路径
PID-COMMANDS: [当前服务所有进程数]
[进程PID: 启动命令]
2. 脚本内容(可独立运行)
#!/bin/bash
# ==============================================
# 获取所有正在运行进程的(除系统进程外)
# 输出: 路径|所有pid
# 输出文件: path_filename
# ==============================================
path_filename="check_server.filepath"
> ${path_filename}
for i in $(ls /proc/ | grep -E "\<[0-9]+\>" | sort -n )
do
# 去掉多余信息,只保留: PID|PATH
fileinfo_tmp=$( ls -l /proc/$i/cwd 2>/dev/null | awk '{if($(11) != "\/" && $(11) != "" && $(11) != "\/home\/muker" && $(11) != "\/data" && $(11) !~ /(\/root|\/var)/ && $(11) !~ /(\/usr\/local\/aegis)/ ) print $0}' 2>/dev/null | awk -F"proc/" '{print $2}' | awk -F"/cwd -> " '{print $1"|"$2}' | sort -t '|' -k 2 )
# 获取有效的 PID、PATH
if [ -n "${fileinfo_tmp}" ]; then
procc_pid=$( echo "${fileinfo_tmp}" | awk -F"|" '{print $1}' )
procc_filepath=$( echo "${fileinfo_tmp}" | awk -F"|" '{print $2}' )
match_cont=$( grep "${procc_filepath}" ${path_filename} )
process_command=$(ps -ef | grep -v grep | grep -vE "\[hostname\]" | grep "${procc_pid}" | awk '{if($2 == "'${procc_pid}'") print $0}' | cut -c 49- )
if [ -z "${match_cont}" ]; then
echo "${procc_filepath}|[${procc_pid}: $process_command]" >> ${path_filename}
else
sed -i '\|'${procc_filepath}'|d' ${path_filename}
echo "${match_cont}|[${procc_pid}: ${process_command}]" >> ${path_filename}
fi
fi
done
# =======================================================
# 列出符合认为判断你的日志类型, 读取文件: path_filename
# 输出:
# ID: []
# PATH: []
# [PID:COMMAND]: []
# 输出文件: result_filename
# =======================================================
result_filename="check_server_file.result"
> ${result_filename}
id_cnt=0
# for 循环时 会以 空格、回车 分割,修改其分割方式 IFS
# 保存当前: IFS_old=$IFS
# 修改以 \n 回车符为分割符: IFS=$'\n'
# 恢复原样: IFS=$IFS_old
IFS_old=$IFS
IFS=$'\n'
id_all_cnt=$( cat ${path_filename} | wc -l )
for line in $( cat ${path_filename} )
do
id_cnt=$(( $id_cnt + 1 ))
pid_cnt=$( echo "${line}" | awk -F"|" '{print NF}' )
pid_filepath="$( echo "${line}" | awk -F"|" '{print $1}' )"
procc_cnt=$( echo "${line}" | awk -F"|" '{print NF}' )
pid_cnt=$(( ${procc_cnt} - 1 ))
echo -e "ALL_CNT: [${id_all_cnt}]\nNOW_ID: [${id_cnt}]\nFILEPATH: ${pid_filepath}\nPID-COMMANDS: [${pid_cnt}]" >> ${result_filename}
for i in $( seq 2 ${procc_cnt} )
do
echo "${line}" | awk -F"|" '{print $'$i'}' >> ${result_filename}
#echo ${pid_command}
done
echo -e "\n" >> ${result_filename}
done
IFS=$IFS_old
rm -rf ${path_filename}