⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 start.ec

📁 在SCO UNIX制定界面程序 可根据文件配制菜单,而不必修改源程序,非常方便
💻 EC
📖 第 1 页 / 共 2 页
字号:
			h_winprompt(my_win, MY_LINES+MY_PAGE, MY_ROWS,
				    "Open cursor error!", 1, 0);
			dt_shm1();
			return(-1);
		}
		del_st_space("sys_module", &p);

		if (get_pid(p.prog_name, &pid) == 0) {
#ifdef zgx010427_modi
			EXEC SQL CLOSE cur_5;
			sprintf(buf,
				"程序 %s 的进程已存在, 请先关闭系统再启动!",
				p.prog_name);
			h_winprompt(my_win, MY_LINES+MY_PAGE, MY_ROWS, buf, 1, 0);
			dt_shm1();
			return(-1);
#else
			/*
			 * 共享内存中虽为ACTIVE,但有可能进程实际上
			 * 已被kill -9 杀掉,因此,须查进程是否确实存在
			 */
			if (kill(pid, 0) == 0) {
				EXEC SQL CLOSE cur_5;
				sprintf(buf,
					"程序 %s 的进程已存在, 请先关闭系统再启动!",
					p.prog_name);
				h_winprompt(my_win, MY_LINES+MY_PAGE, MY_ROWS, buf, 1, 0);
				dt_shm1();
				return(-1);
			} else {
				/*
				 * 进程号所指的进程已不存在,修正
				 * 内存中模块运行状态
				 */
				upd_shm_pid( p.prog_name, pid, KILLED );
			}
#endif
		}
	}

	EXEC SQL CLOSE cur_5;

	dt_shm1();
	return(0);
}

/*
 * 扫描尚未正常关闭的模块,若有则关闭之
 */
int kill_all_module(WINDOW *my_win)
{
	char	buf[90];
	int	pid;
	PSTAT	pp;

	EXEC SQL DECLARE cur_kill CURSOR FOR
	SELECT * FROM sys_module	
	WHERE start_mode not in ('0', '1')
	ORDER BY module_id ;
	if (SQLCODE) { 
		errcall(ERROR, "Declare cursor error!(cur_kill:%d)", SQLCODE);
		h_winprompt(my_win, MY_LINES+MY_PAGE, MY_ROWS, "Declare cursor error!",
			    1, 0);
		return(-1);
	}

	EXEC SQL OPEN cur_kill;
	if (SQLCODE) { 
		errcall(ERROR, "Open cursor error!(cur_kill:%d)", SQLCODE);
		h_winprompt(my_win, MY_LINES+MY_PAGE, MY_ROWS, "Open cursor error!",
			    1, 0);
		return(-1);
	}

	while (1) {
		EXEC SQL FETCH cur_kill INTO :p;
		if (SQLCODE == 100) break;
		if (SQLCODE) {
			errcall(ERROR, "Fetch cursor error!(cur_kill:%d)", SQLCODE);
			EXEC SQL CLOSE cur_kill;
			h_winprompt(my_win, MY_LINES+MY_PAGE, MY_ROWS,
				    "Open cursor error!", 1, 0);
			return(-1);
		}
		del_st_space("sys_module", &p);

		killproc(p.prog_name, SIGUSR1);
	}

	EXEC SQL CLOSE cur_kill;

	return(0);
}

/*
 * 关闭系统
 */
stopsys()
{
	S_sys_param sy;
	WINDOW *my_win, *subwin;
	char filename[128], buf[256], tail[60], ch;
	int pid, cnt;
	PUBLIC pub;
	PSTAT pp;

	sprintf(filename, "/tmp/.stopsys.%d", getpid());
	scr_dump(filename);

	disp_below("关闭系统");
	prompt_bottom(LINES-1, 0, 1, " ");
	my_win = newwin(18,80,3,0);
	mvwprintw(my_win, 0, 0, "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
	wrefresh(my_win);

	fail = 0;

	h_winprompt(my_win, MY_LINES, MY_ROWS, "是否要关闭系统?(Y/N)", 0, 0);
	ch = getch();
	if (ch != 'Y' && ch != 'y') {
		delwin(my_win);
		scr_restore(filename);
		unlink(filename);
		return(0);
	}

	h_winprompt(my_win, MY_LINES, MY_ROWS, "正在关闭系统, 请稍候 ...", 0, 0);

	subwin = newwin(13, 80, 7, 0);
	scrollok(subwin, TRUE);

	line = 0;

	select_sys_param(&sy);
	sprintf(buf, "select count(*) from bank_base where \
		bank_id = '%s' and host_id = '%s' and moni_enable = 'Y'",
		sy.adm_bank_id, sy.adm_host_id);
	if (query_count(buf)) {
		sprintf(buf, "select count(*) from bank_base where \
			bank_id = '%s' and host_id = '%s' and login_stat = 'I'",
			sy.adm_bank_id, sy.adm_host_id);
		if (query_count(buf) &&
			(strcmp(sy.bank_id, sy.adm_bank_id) ||
			strcmp(sy.host_id, sy.adm_host_id)) ) {
			/* 向管辖行进行网络签退 */
			if (!netlog_proc(1, &pub)) {
				log_net(pub.Rcv_bank_id,pub.Rcv_host_id,"签退");
				sprintf(tail, "%-30s", "成功!");
			} else
				sprintf(tail, "%-30s", "失败!");
			strcpy(pub.Acq_bank_id, pub.Rcv_bank_id);
			strcpy(pub.Acq_host_id, pub.Rcv_host_id);
			new_repos(MSG_TRANS, &pub, sizeof(PUBLIC));
			sprintf(buf, "进行 %-40s %s", "主机签退", tail);
			h_winprompt(subwin, line, MY_ROWS, buf, 0, 0);
			if (line < 12) line++;
		}
	}

	$declare cur_6 cursor for
	select * from sys_module
	where start_mode != '0'
	order by module_id;
	if (SQLCODE) { 
		errcall(ERROR, "Declare cursor error!(stopsys:%d)", SQLCODE);
		h_winprompt(my_win, MY_LINES+MY_PAGE, MY_ROWS, "Declare cursor error!",
			    1, 0);
		delwin(subwin);
		delwin(my_win);
		scr_restore(filename);
		unlink(filename);
		return(-1);
	}

	$open cur_6;
	if (SQLCODE) { 
		errcall(ERROR, "Open cursor error!(stopsys:%d)", SQLCODE);
		h_winprompt(my_win, MY_LINES+MY_PAGE, MY_ROWS, "Open cursor error!",
			    1, 0);
		delwin(subwin);
		delwin(my_win);
		scr_restore(filename);
		unlink(filename);
		return(-1);
	}

	while (1) {
		$fetch cur_6 into :p;
		if (SQLCODE == 100) break;
		if (SQLCODE < 0) {
			errcall(ERROR, "Fetch cursor error!(stopsys:%d)", SQLCODE);
			$close cur_6;
			h_winprompt(my_win, MY_LINES+MY_PAGE, MY_ROWS,
				    "Fetch cursor error!", 1, 0);
			delwin(subwin);
			delwin(my_win);
			scr_restore(filename);
			unlink(filename);
			dt_shm1();
			return(-1);
		}
		del_st_space("sys_module", &p);

		if (get_pid(p.prog_name, &pid) == 0) {
			kill(pid, SIGUSR1);
		}
	}

	$close cur_6;

	sleep(5);

	$open cur_6;
	if (SQLCODE < 0) {
		errcall(ERROR, "Open cursor error!(stopsys:%d)", SQLCODE);
		$close cur_6;
		h_winprompt(my_win, MY_LINES+MY_PAGE, MY_ROWS,
			    "Open cursor error!", 1, 0);
		delwin(subwin);
		delwin(my_win);
		dt_shm1();
		scr_restore(filename);
		unlink(filename);
		return(-1);
	}

	while (1) {
		$fetch cur_6 into :p;
		if (SQLCODE == 100) break;
		if (SQLCODE < 0) {
			errcall(ERROR, "Fetch cursor error!(stopsys:%d)", SQLCODE);
			$close cur_6;
			h_winprompt(my_win, MY_LINES+MY_PAGE, MY_ROWS,
				    "Fetch cursor error!", 1, 0);
			delwin(subwin);
			delwin(my_win);
			dt_shm1();
			scr_restore(filename);
			unlink(filename);
			return(-1);
		}
		del_st_space("sys_module", &p);

		cnt = 0;
		while (cnt < 5) {
			if (get_pid(p.prog_name, &pid) == 0 &&
			    kill(pid, 0) == 0) {
				kill(pid, SIGUSR1);
				sleep(2);
				cnt++;
			} else break;
		}
		if (cnt >= 5) {
#ifdef zgx010520_added
			errcall(ERROR, "%s[%d] close error, kill -9 now",
				p.prog_name, pid);
			kill(pid, 9);
			sleep(2);
			if (kill(pid, 0) && errno == ESRCH)
				cnt = 0;
#else
			/*
			 * 在多次为关闭成功后,
			 * 尝试用ps -e命令查找的方式,kill之
			 */
			killproc(p.prog_name, SIGUSR1);
			errcall(ERROR, "%s[%d] close error, kill -9 now",
				p.prog_name, pid);
			sleep(2);
			kill(pid, SIGKILL);
			killproc(p.prog_name, SIGKILL);
			sleep(2);
			if (kill(pid, 0) && errno == ESRCH)
				cnt = 0;
#endif
		}
		if (cnt < 5) {
			sprintf(buf, "关闭 %-40s 成功!%25s", p.prog_desc,
				" ");
			h_winprompt(subwin, line, MY_ROWS, buf, 0, 0);
			if (line < 12) line++;
		} else {
			sprintf(buf, "关闭 %-40s 失败!%25s", p.prog_desc,
				" ");
			h_winprompt(subwin, line, MY_ROWS, buf, 0, 0);
			if (line < 12) line++;
			fail++;
		}
		nap(400);
	}

	$close cur_6;
	dt_shm1();

	if (!no_init()) {
		del_bank_stat_moni();

		if (rmsg_nonb(RESP_MSG) < 0) {
			errcall(ERROR, "rmsg_nonb RESP_MSG error");
			fail++;
		}
		if (rmsg_nonb(REQ_MSG) < 0) {
			errcall(ERROR, "rmsg_nonb REQ_MSG error");
			fail++;
		}
#ifdef zgx010717_added
#else
		if (rmsg_nonb(TO_SAFE) < 0) {
			errcall(ERROR, "rmsg_nonb TO_SAFE error");
			fail++;
		}
		if (rmsg_nonb(FROM_SAFE) < 0) {
			errcall(ERROR, "rmsg_nonb FROM_SAFE error");
			fail++;
		}
#endif
		if (rmsg(MONITOR) < 0) {
			errcall(ERROR, "rmsg MONITOR error");
			fail++;
		}
		if (rshm1() < 0) {
			errcall(ERROR, "rm_shm  error");
			fail++;
		}
	}

	if (fail)
		h_winprompt(my_win, MY_LINES+MY_PAGE, MY_ROWS, "关闭系统失败!", 1, 0);
	else
		h_winprompt(my_win, MY_LINES+MY_PAGE, MY_ROWS, "关闭系统成功!", 1, 0);
	
	delwin(subwin);
	delwin(my_win);
	scr_restore(filename);
	unlink(filename);
	
	return(0);
}

#ifdef zgx020425_del
/* Move to mytools/errcall.c */
/*---------------------------------------------------
判系统是否已初始化
return:	1  ---  NOT INIT
	0  ---  INIT SUCC
-----------------------------------------------------*/
no_init()
{
	key_t	key;
	int	shid;

	if ((key = getipckey(SHMFILE, SHMID1)) < 0) {
		errcall(ERROR, "SHMFILE err! getipckey err!");
		return(1);
	}

	if ((shid = shmget(key, sizeof(SHM1), IPCGET)) < 0) {
		return(1);
	}

	return(0);
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -