shell script : stop program
发布时间:2020-12-15 16:44:02 所属栏目:安全 来源:网络整理
导读:序 今天同事让我写一个停止自己工程的脚本. 写了一会,他说发现已经有这个脚本了,不跟我玩了。 回来自己将这个实验做完。 测试程序:根据退出标记文件,进行安全退出。 脚本:先做出退出标记文件,睡眠,如果程序还不退出,杀掉。 实验 实验环境:debian7.5
序今天同事让我写一个停止自己工程的脚本. 实验实验环境:debian7.5 实验工程下载点linux_shell_script_to_stop_prog.zip 实验工程// @file main.cpp
// @brief test prog to quit or be kill
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
// shell script gen file : touch /tmp/cmd_quit.flag
#define EXIST_FLAG_FILE_NAME "/tmp/cmd_quit.flag"
bool is_file_exist(const char* psz_file_pathname);
int main(int argc,char* argv[])
{
long l_cnt = 0;
printf("prog was runningn");
do {
sleep(2);
printf("%8.8ld runing ...n",++l_cnt);
} while (!is_file_exist(EXIST_FLAG_FILE_NAME));
printf("THE ENDn");
return EXIT_SUCCESS; // EXIT_SUCCESS or EXIT_FAILURE
}
bool is_file_exist(const char* psz_file_pathname) {
if (NULL == psz_file_pathname) {
return false;
}
if (0 == access(psz_file_pathname,F_OK)) {
return true;
}
else {
return false;
}
}
实验工程的Makefile# ==============================================================================
# @file Makefile
# @brief
# lostspeed 2017-07-10
# for my_scriptstop_progtest_prog
# @note
# 必须在Makefile目录下新建至少一个子目录!,否则产生的SUBOBJ和ROOTOBJ有重名,导致编译失败
# 为了不建立无意义的文件夹(e.g. 只有一个主文件main.cpp),在Makefile统计目录建立一个文件夹main
# 将主文件main.cpp放到main中,就可以编译过了
#
# 从博客上回帖的Makefile内容,每行前面的t都变成空格了,bash不认,杯具啊
#
# ==============================================================================
MAKE_VER = ./main/Makefile 1.0.0.1 build 2017-07-10 23:15
BIN = test_prog_to_end
TARGETS = ${BIN}
CC = g++
CFLAGS = -Wall
--std=c++11
-g
INC_PATH = -I.
# 要包含的库(.a,.o),要写上相对路径或绝对路径,而不能让编译器去到库路径中去找
MY_LIBS =
PRJ_LIBS = ${MY_LIBS}
LIB_LINK_OPT = -lstdc++ -pthread -lpthread -lrt -ldl
SUBDIR = $(shell ls -d */)
ROOTSRC = $(wildcard *.cpp)
ROOTOBJ = $(ROOTSRC:.cpp=.o)
SUBSRC = $(shell find $(SUBDIR) -name '*.cpp')
SUBOBJ = $(SUBSRC:.cpp=.o)
help:
@echo make help
@echo "command list:"
@echo make clean
@echo make all
@echo make rebuild
@echo TARGETS = ${TARGETS}
show_version:
@echo ================================================================================
@echo ${MAKE_VER}
@echo ================================================================================
ls -l -p --time-style="+%Y-%m-%d %H:%M:%S" $(find `pwd`)
@echo --------------------------------------------------------------------------------
clean:
clear
make show_version
@echo ================================================================================
@echo make clean
@echo BIN = $(BIN)
@echo ROOTOBJ = $(ROOTOBJ)
@echo SUBOBJ = $(SUBOBJ)
@echo ================================================================================
rm -f $(BIN) $(ROOTOBJ) $(SUBOBJ)
all: ${TARGETS}
make show_version
@echo ================================================================================
if [ -f $(BIN) ] ;
then
echo "build ok :)" ;
else
echo "build failed :(" ;
fi;
@echo ================================================================================
$(BIN): $(ROOTOBJ) $(SUBOBJ)
${CC} ${CFLAGS} ${INC_PATH}
$(ROOTOBJ) $(SUBOBJ)
${PRJ_LIBS} ${LIB_LINK_OPT}
-o ${BIN}
.cpp.o:
# $^ is main/main.cpp
# $< is main/main.cpp
# $@ is main/main.o
@echo $<
@echo build $^ ...
${CC} ${CFLAGS} ${INC_PATH} -c $^ -o $@
rebuild:
make clean
make all
停止程序的脚本#!/bin/bash
# # @file stop_test_prog_to_end.sh
# shell script to stop test_prog_to_end
PROG_NAME="test_prog_to_end"
cmd_quit_flag_file="/tmp/cmd_quit.flag"
pid=""
let "prog_is_run=0"
let "prog_is_runing=0"
function sh_main {
clear
ps aux |grep $PROG_NAME
fn_get_pid $PROG_NAME
if [ "$pid" == "" ] ;
then
let "prog_is_run=0" ;
echo "*prog not run,needn't to stop :)" ;
else
let "prog_is_run=1" ;
echo "*prog was run,stop now,please wait..." ;
fn_kill_proc $PROG_NAME $pid ;
fi;
if [ 1 = $prog_is_run ] ;
then
fn_check_prog_is_stop_ok_and_show_result PROG_NAME;
fi;
fn_rm_file "$cmd_quit_flag_file"
}
function fn_touch_file {
if [ ! -f $1 ]; then
touch $1
else
echo "found $1,needn't touch"
fi
}
function fn_rm_file {
if [ ! -f $1 ]; then
echo "not found $1,needn't rm"
else
rm $1
fi
}
function fn_check_prog_is_stop_ok_and_show_result {
fn_get_pid $1 ;
if [ -z pid ] ;
then
echo "**prog not run,stop success :)" ;
else
if [ "$pid" != "" ] ;
then
echo "**prog was run,stop failed,sorry :(" ;
else
echo "**prog not run,stop ok :)" ;
fi;
fi;
}
function fn_get_pid {
pid=$(pidof $1)
echo "$1 's PID = [$pid]"
}
function fn_notify_prog_to_quit {
# some notify action
fn_touch_file "$cmd_quit_flag_file"
# wait prog was quit
# now sleep a while
sleep $1
}
# fn_kill_proc $PROG_NAME $pid
function fn_kill_proc {
fn_notify_prog_to_quit 3
fn_get_pid $1 ;
if [ -z pid ] ;
then
echo "prog not run,needn't kill :)" ;
else
if [ "$pid" != "" ] ;
then
echo "prog was run,will be force killed,please wait a moment..." ;
# if prog not end after notify,kill it force
kill -9 $2 ;
echo "was killed $1" ;
else
echo "*prog not run,needn't kill :)" ;
fi;
fi;
}
sh_main "$@"
# ================================================================================
# run result for killed
# ================================================================================
# root 6211 0.0 0.0 18720 884 pts/1 S+ 01:35 0:00 ./test_prog_to_end
# root 6212 0.0 0.0 11152 1504 pts/2 S+ 01:36 0:00 /bin/bash ./stop_test_prog_to_end.sh
# root 6215 0.0 0.0 8196 892 pts/2 S+ 01:36 0:00 grep test_prog_to_end
# test_prog_to_end 's PID = [6211]
# *prog was run,please wait...
# test_prog_to_end 's PID = [6211]
# prog was run,please wait a moment...
# was killed test_prog_to_end
# PROG_NAME 's PID = []
# **prog not run,stop ok :)
# ================================================================================
# run result for stop for safe quit
# ================================================================================
# root 6286 0.0 0.0 18720 884 pts/1 S+ 01:39 0:00 ./test_prog_to_end
# root 6287 0.0 0.0 11152 1504 pts/2 S+ 01:39 0:00 /bin/bash ./stop_test_prog_to_end.sh
# root 6290 0.0 0.0 8196 888 pts/2 S+ 01:39 0:00 grep test_prog_to_end
# test_prog_to_end 's PID = [6286]
# *prog was run,please wait...
# test_prog_to_end 's PID = []
# *prog not run,needn't kill :)
# PROG_NAME 's PID = []
# **prog not run,stop ok :)
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |