Identify process ID for the multiple informix inst
Posted in 2016
With several Informix instances on one UNIX box, the poster wanted to tell which oninit processes and shared-memory segments belong to which instance, so stale segments could be removed with ipcrm. Replies gave working answers: use 'onstat -g glo' (or -g sch) to list virtual processors and their PIDs; derive each instance's shm key from SERVERNUM (0x5256 + servernum, then 0x4800 + segment number, cross-referenced via 'ipcs -m' and 'ipcs -mp' to find the creating PID, with 'onstat -g dis' giving server numbers even when down). Madison Pruet posted a C program to map processes and segments, and others suggested 'onclean' for cleanup, though the poster noted it sometimes fails, requiring the manual route.
Auto-generated by DrWatson from the posts below — may be imperfect; read the full thread.
Topics: General Discussion
Dear All, I have running multiple instance running in one UNIX box and would like to get which process id belongs to which on so that if any issue on the shared memory segment allocation fail so that kill from ipcrm command. Please advise how to get the process id belongs to which instance Thank you --089e01295380abe96d052e4ad50c
onstat -g glo or onstat -g sch are your friends. Both would list all=20'virtual processors' (oninit processes) running for a given instance from=20
Informix perspective, also providing OS process id (pid) information.
HTH,
Andreas
From: "medkba" <medkba@gmail.com>
To: ids@iiug.org
Date: 18.03.2016 07:29
Subject: Identify process ID for the multiple informix .... [36776]
Sent by: ids-bounces@iiug.org
Dear All,=20
I have running multiple instance running in one UNIX box and would like to =
get which process id belongs to which on so that if any issue on the=20
shared=20
memory segment allocation fail so that kill from ipcrm command.=20
Please advise how to get the process id belongs to which instance=20
Thank you=20
--089e01295380abe96d052e4ad50c=20
***************************************************************************=
****=20
Forum Note: Use "Reply" to post a response in the discussion forum.=20
The shared memory key for the segments is constructed by adding the hex
value of the SERVERNUM for the instance to 0x5256. That makes up the first
four hex digits of each segment. The remaining four digits are 0x4800 plus
the segment number (so 1, 2, etc.). For example if the SERVERNUM is 1 the
keys would be 0x52574801, 0x52574802, etc. My server is SERVERNUM 101, so
my keys are 0x58bb4801, 0x52bb4802, etc.
You can get the pids either using onstat -g glo or my using ipcs -m which
will show you the pid of the master oninit which created the segments. Then
using ps -f you can see all the processes which are children and
grandchildren of that process.
Art
Art S. Kagel, President and Principal Consultant
ASK Database Management
www.askdbmgt.com
Blog: http://informix-myview.blogspot.com/
Disclaimer: Please keep in mind that my own opinions are my own opinions
and do not reflect on the IIUG, nor any other organization with which I am
associated either explicitly, implicitly, or by inference. Neither do
those opinions reflect those of other individuals affiliated with any
entity with which I am affiliated nor those of the entities themselves.
On Fri, Mar 18, 2016 at 12:55 AM, medkba <medkba@gmail.com> wrote:
> Dear All,
>
> I have running multiple instance running in one UNIX box and would like to
> get which process id belongs to which on so that if any issue on the shared
> memory segment allocation fail so that kill from ipcrm command.
>
> Please advise how to get the process id belongs to which instance
>
> Thank you
>
> --089e01295380abe96d052e4ad50c
>
>
>
>
*******************************************************************************
> Forum Note: Use "Reply" to post a response in the discussion forum.
>
>
--001a113eca06f700a8052e504e20
Hi,
You can find the shared segments by adding 21078 to the server number and the
convert the result into hexadecimal and concatenating 48 to it.
Must of the cases you're able to get it by:
onstat -g dis | egrep "Server ( |N)" | awk '!(NR%2){print p"
"$NF+21078}{p=$NF}' | awk '{printf "%s|%02X48\\
", $1, $2}'
No need for a running instance.
Then you can run the ipcs -m to cross the information you get with the Shared
Memory Segments Keys and get the shmid.
Now, if you want the parent pid you should run the ipcs -mp and cross the
shmid with the cpid.
Example:
[infx1210@tardis INFORMIXTMP]$ onstat -g dis
IBM Informix Dynamic Server Version 12.10.FC5DE -- On-Line -- Up 00:13:28 --522128 Kbytes
There are 3 servers found
Server : infx1210
Server Number : 3
Server Type : IDS
Server Status : Up
Server Version: IBM Informix Dynamic Server Version 12.10.FC5DE
Shared Memory : 0x44000000
INFORMIXDIR : /opt/IBM/informix/V12.1
ONCONFIG : /opt/IBM/informix/V12.1/etc/onconfig.infx1210
SQLHOSTS : /home/informix/etc/sqlhosts
Host : tardis
Server : infx1150
Server Number : 1
Server Type : IDS
Server Status : Down
Server Version: IBM Informix Dynamic Server Version 11.50.FC9DE
Shared Memory : 0x44000000
INFORMIXDIR : /opt/IBM/informix/V11.5
ONCONFIG : /opt/IBM/informix/V11.5/etc/onconfig.infx1150
SQLHOSTS : /home/informix/etc/sqlhosts
Host : tardis
[infx1210@tardis INFORMIXTMP]$ onstat -g dis | egrep "Server ( |N)" | awk
'!(NR%2){print p" "$NF+21078}{p=$NF}' | awk '{printf "%s|%02X48\\
", $1, $2}'
infx1210|525948
infx1150|525748
[infx1210@tardis INFORMIXTMP]$ ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x52594801 0 root 660 6291456 8
0x52594802 32769 root 660 33439744 8
0x52594803 65538 root 660 115343360 8
0x52594804 98307 root 660 44040192 8
0x52594805 131076 root 660 65011712 8
0x52594806 163845 root 660 85983232 8
0x52594807 196614 root 660 167772160 8
0x52594808 229383 informix 660 8388608 8
0x52594809 262152 informix 660 8388608 8
[infx1210@tardis INFORMIXTMP]$ ipcs -mp
------ Shared Memory Creator/Last-op PIDs --------
shmid owner cpid lpid
0 root 2547 3217
32769 root 2547 3217
65538 root 2547 3217
98307 root 2547 3217
131076 root 2547 3217
163845 root 2547 3217
196614 root 2547 3217
229383 informix 2547 3217
262152 informix 2547 3217
[infx1210@tardis INFORMIXTMP]$ ps -fp 2547
UID PID PPID C STIME TTY TIME CMD
informix 2547 1 1 10:46 ? 00:00:09 oninit -v
[infx1210@tardis INFORMIXTMP]$
In the docs you'll find:
http://www.ibm.com/support/knowledgecenter/SSGU8G_12.1.0/com.ibm.admin.doc/ids_a
dmin_1218.htm?lang=en
Keen regards.
Hi,
You can find the shared segments by adding 21078 to the server number and
the convert the result into hexadecimal and concatenating 48 to it.
Must of the cases you're able to get it by:
onstat -g dis | egrep "Server ( |N)" | awk '!(NR%2){print p"
"$NF+21078}{p=$NF}' | awk '{printf "%s|%02X48\\
", $1, $2}'
No need for a running instance.
Then you can run the ipcs -m to cross the information you get with the
Shared Memory Segments Keys and get the shmid.
Now, if you want the parent pid you should run the ipcs -mp and cross the
shmid with the cpid.
Example:
[infx1210@tardis INFORMIXTMP]$ onstat -g dis
IBM Informix Dynamic Server Version 12.10.FC5DE -- On-Line -- Up 00:13:28
-- 522128 KbytesThere are 3 servers found
Server : infx1210
Server Number : 3
Server Type : IDS
Server Status : Up
Server Version: IBM Informix Dynamic Server Version 12.10.FC5DE
Shared Memory : 0x44000000
INFORMIXDIR : /opt/IBM/informix/V12.1
ONCONFIG : /opt/IBM/informix/V12.1/etc/onconfig.infx1210
SQLHOSTS : /home/informix/etc/sqlhosts
Host : tardis
Server : infx1150
Server Number : 1
Server Type : IDS
Server Status : Down
Server Version: IBM Informix Dynamic Server Version 11.50.FC9DE
Shared Memory : 0x44000000
INFORMIXDIR : /opt/IBM/informix/V11.5
ONCONFIG : /opt/IBM/informix/V11.5/etc/onconfig.infx1150
SQLHOSTS : /home/informix/etc/sqlhosts
Host : tardis
[infx1210@tardis INFORMIXTMP]$ onstat -g dis | egrep "Server ( |N)" | awk
'!(NR%2){print p" "$NF+21078}{p=$NF}' | awk '{printf "%s|%02X48\\
", $1, $2}'
infx1210|525948
infx1150|525748
[infx1210@tardis INFORMIXTMP]$ ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x52594801 0 root 660 6291456 8
0x52594802 32769 root 660 33439744 8
0x52594803 65538 root 660 115343360 8
0x52594804 98307 root 660 44040192 8
0x52594805 131076 root 660 65011712 8
0x52594806 163845 root 660 85983232 8
0x52594807 196614 root 660 167772160 8
0x52594808 229383 informix 660 8388608 8
0x52594809 262152 informix 660 8388608 8
[infx1210@tardis INFORMIXTMP]$ ipcs -mp
------ Shared Memory Creator/Last-op PIDs --------
shmid owner cpid lpid
0 root 2547 3217
32769 root 2547 3217
65538 root 2547 3217
98307 root 2547 3217
131076 root 2547 3217
163845 root 2547 3217
196614 root 2547 3217
229383 informix 2547 3217
262152 informix 2547 3217
[infx1210@tardis INFORMIXTMP]$ ps -fp 2547
UID PID PPID C STIME TTY TIME CMD
informix 2547 1 1 10:46 ? 00:00:09 oninit -v
[infx1210@tardis INFORMIXTMP]$
In the docs you'll find:
http://www.ibm.com/support/knowledgecenter/SSGU8G_12.1.0/com.ibm.admin.doc/ids_a
dmin_1218.htm?lang=en
Keen regards.
On Fri, 18 Mar 2016 at 06:29 medkba <medkba@gmail.com> wrote:
> Dear All,
>
> I have running multiple instance running in one UNIX box and would like to
> get which process id belongs to which on so that if any issue on the shared
> memory segment allocation fail so that kill from ipcrm command.
>
> Please advise how to get the process id belongs to which instance
>
> Thank you
>
> --089e01295380abe96d052e4ad50c
>
>
>
>
*******************************************************************************
> Forum Note: Use "Reply" to post a response in the discussion forum.
>
>
--001a11c3c6d29d4466052e50ac7c
I don't know what version of Informix you're on, but you may want to see if you have "onclean" available. It will remove those memory segments for you. Mike Walker Advanced DataTools -----Original Message----- From: ids-bounces@iiug.org [mailto:ids-bounces@iiug.org] On Behalf Of medkba Sent: Thursday, March 17, 2016 10:56 PM To: ids@iiug.org Subject: Identify process ID for the multiple informix .... [36776] Dear All, I have running multiple instance running in one UNIX box and would like to get which process id belongs to which on so that if any issue on the shared memory segment allocation fail so that kill from ipcrm command. Please advise how to get the process id belongs to which instance Thank you --089e01295380abe96d052e4ad50c **************************************************************************** *** Forum Note: Use "Reply" to post a response in the discussion forum.
Here is a program I wrote years ago to map out what process spawned what . One
of the things that I added to the basic program is what process created what
shared memory segment and if it was a segment that had the pattern of the IDS
shmem, then I would display the server number and the relative shm number
within that server. It must be run as root... As an example....
sudo format_ps...
| | . . . 2 4426 4430 gnome-pty-helper
| | . . . 2 4426 4431 bash
| | | . . 3 4431 4563 format_ps
| | | | . 4 4563 4564 ps -ef
| | . . . 2 4426 4517 bash
| | | . . 3 4517 4557 vim format_ps.c
| . . . . 1 1 4462 gnome-screensaver
| . . . . 1 1 4469 oninit 0x52574801 1/1
| . . . . 0x52574802 1/2
| . . . . 0x52574803 1/3
| . . . . 0x52574804 1/4
| | . . . 2 4469 4470 oninit
| | | . . 3 4470 4471 oninit
| | | . . 3 4470 4472 oninit
| | | . . 3 4470 4473 oninit
| | | . . 3 4470 4475 oninit
| | | . . 3 4470 4476 oninit
| | | . . 3 4470 4477 oninit
indicates that instance 1 has 4 shared memory segments had has spawned 8
oninit processes. I'm including the source code...
------------------------------------------------- format_ps.c
--------------------------------------------------------------------------------
-----#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#define PERROR(x) {perror((x)); exit(1);}
typedef struct ps_node {
struct ps_node *next;
struct ps_node *next_sib;
struct ps_node *head_child;
struct ps_node *end_child;
int pid;
int ppid;
char *command;
} ps_t;
typedef struct shm_node {
struct shm_node *next;
pid_t cpid;
char key[40];
long shmid;
} shm_t;
shm_t *shmhead = NULL;
shm_t *shmtail = NULL;
ps_t *pshead = NULL;
ps_t *pstail = NULL;
ps_t *first_ps = NULL;
ps_t *orphan_head = NULL;
int spaceing = 0;
ps_t *orphan_tail = NULL;
ps_t*
allocate_ps_node()
{ ps_t *tps = (ps_t *)calloc(sizeof(char),sizeof(ps_t));
if (!tps)
{ PERROR("allocate_ps_node() malloc");
}
return tps;
}
shm_t*
init_shm_node(char *key, long shmid)
{ shm_t *tps = (shm_t *) calloc(sizeof(char), sizeof(shm_t));
if (!tps)
{ PERROR("allocate_shm_node() calloc");
}
tps->shmid = shmid;
strcpy(tps->key, key);
if (!shmhead)
shmhead = tps;
else shmtail->next = tps;
shmtail = tps;
}
shm_t*
find_shm_node(pid_t cpid)
{ shm_t *tps;
for (tps = shmhead; tps; tps = tps->next)
{ if (tps->cpid == cpid) return tps;
}
return NULL;
}
shm_t*
find_shm_node_by_shmid(long shmid)
{
shm_t *tps;
for (tps = shmhead; tps; tps = tps->next)
if (tps->shmid == shmid) return tps;
return NULL;
}
void
insert_ps_node(ps_t *tps)
{ ps_t *tmpps=pshead;
if (!pshead)
{ pshead = tps;
pstail = tps;
}
else
{ while ((tmpps->next) && (tmpps->next->pid < tps->pid))
{ tmpps = tmpps->next;
}
if (tmpps->next)
{ tps->next = tmpps->next;
tmpps->next = tps;
}
else
{ tmpps->next = tps;
}
}
}
ps_t*
find_ps_node (int pid)
{ ps_t *tps;
for (tps = pshead; tps; tps=tps->next)
{ if (tps->pid == pid) break;
}
return tps;
}
void
link_to_parent(ps_t *tps)
{ ps_t *tpps = find_ps_node(tps->ppid);
if (tpps)
{ if (tpps->head_child)
{ tpps->end_child->next_sib = tps;
}
else tpps->head_child = tps;
tpps->end_child = tps;
}
else
{ if (orphan_head) orphan_tail->next_sib = tps;
else orphan_head = tps;
orphan_tail = tps;
}
}
int
max_depth(ps_t *tps)
{ int max_below_me = 0;
int tnum;
while (tps)
{ if (tps->head_child)
{ tnum = max_depth(tps->head_child);
if (tnum > max_below_me) max_below_me = tnum;
}
tps=tps->next_sib;
}
return (max_below_me + 1);
}
void
print_heading()
{ int tspace = spaceing;
while(tspace-- > 0) printf(" ");
printf("LEVEL PPID PID COMMAND SHM KEY SERVERNUM/SEG\\
");
}
void
print_this_node(int level, ps_t *tps)
{ int tspace = spaceing - level;
int tlev = level;
shm_t *tpnt;
int first_line = 1;
unsigned long tkey=0;
while (tlev--) printf("| ");
while (tspace-- > 0) printf(". ");
printf("%2d %6d %6d %-12s",level, tps->ppid, tps->pid, tps->command);
for (tpnt = shmhead; tpnt; tpnt=tpnt->next)
{ if (tpnt->cpid == tps->pid)
{
if (first_line && (strlen(tps->command) > 12))
{
first_line = 0;
printf("\\
");
}
if (!first_line)
{ tspace = spaceing - level;
tlev = level;
while (tlev--) printf("| ");
while (tspace-- > 0) printf(". ");
printf("%2s %6s %6s %12s","","","","");
}
first_line = 0;
printf(" %s", tpnt->key);
if (strstr(tps->command, "oninit"))
{ char *keypnt = tpnt->key;
if (*keypnt == '0') keypnt++;
if (toupper(*keypnt) == 'X') keypnt++;
sscanf(keypnt," %x ",&tkey);
if ((tkey & 0xff00ff00) == 0x52004800)
{ int servernum = (((tkey >> 16) & 0xff) - 0x56);
int segmentnum = tkey & 0xff;
printf(" %d/%d", servernum, segmentnum);
}
}
printf("\\
");
}
}
if (first_line) printf("\\
");
}
void
print_node(ps_t *tps)
{ static int level = -1;
level++;
while (tps)
{ print_this_node(level, tps);
print_node(tps->head_child);
tps=tps->next_sib;
}
level--;
}
int
main(int pcnt, char* parm[])
{ ps_t *tps=NULL;
int tint;
char buffer[32000];
char fld1[40];
char fld2[40];
char fld3[40];
char fld4[40];
char fld5[40];
char *tpnt;
FILE *ps_fd;
FILE *ipcs_fd;
pshead = NULL;
if ((ps_fd = popen("ps -ef","r")) == NULL)
{ perror("can not start ps -el\\
");
exit(1);
}
fgets(buffer, sizeof(buffer),ps_fd);
while (!feof(ps_fd))
{ if (fgets(buffer, sizeof(buffer), ps_fd))
{
char *myCmd = "";
if ((int)strlen(buffer) > 30)
{ int skip = 0;
tps = allocate_ps_node();
sscanf(buffer,"%*s %i %i", &(tps->pid), &(tps->ppid));
tpnt = buffer;
while (*tpnt && skip < 7)
{
while (*tpnt && (*tpnt > ' ')) tpnt++;
if (*
Thank you very much Art, Ricardo
On Fri, Mar 18, 2016 at 7:50 PM, Ricardo Henriques <
ricardoaireshenriques@gmail.com> wrote:
> Hi,
>
> You can find the shared segments by adding 21078 to the server number and
> the convert the result into hexadecimal and concatenating 48 to it.
>
> Must of the cases you're able to get it by:
> onstat -g dis | egrep "Server ( |N)" | awk '!(NR%2){print p"
> "$NF+21078}{p=$NF}' | awk '{printf "%s|%02X48\\
", $1, $2}'>
> No need for a running instance.
>
> Then you can run the ipcs -m to cross the information you get with the
> Shared Memory Segments Keys and get the shmid.
>
> Now, if you want the parent pid you should run the ipcs -mp and cross the
> shmid with the cpid.
>
> Example:
> [infx1210@tardis INFORMIXTMP]$ onstat -g dis
>
> IBM Informix Dynamic Server Version 12.10.FC5DE -- On-Line -- Up 00:13:28
> -- 522128 Kbytes> There are 3 servers found
> Server : infx1210
> Server Number : 3
> Server Type : IDS
> Server Status : Up
> Server Version: IBM Informix Dynamic Server Version 12.10.FC5DE
> Shared Memory : 0x44000000
> INFORMIXDIR : /opt/IBM/informix/V12.1
> ONCONFIG : /opt/IBM/informix/V12.1/etc/onconfig.infx1210
> SQLHOSTS : /home/informix/etc/sqlhosts
> Host : tardis
>
> Server : infx1150
> Server Number : 1
> Server Type : IDS
> Server Status : Down
> Server Version: IBM Informix Dynamic Server Version 11.50.FC9DE
> Shared Memory : 0x44000000
> INFORMIXDIR : /opt/IBM/informix/V11.5
> ONCONFIG : /opt/IBM/informix/V11.5/etc/onconfig.infx1150
> SQLHOSTS : /home/informix/etc/sqlhosts
> Host : tardis
>
> [infx1210@tardis INFORMIXTMP]$ onstat -g dis | egrep "Server ( |N)" | awk
> '!(NR%2){print p" "$NF+21078}{p=$NF}' | awk '{printf "%s|%02X48\\
", $1,
> $2}'
> infx1210|525948
> infx1150|525748
> [infx1210@tardis INFORMIXTMP]$ ipcs -m
>
> ------ Shared Memory Segments --------
> key shmid owner perms bytes nattch status
> 0x52594801 0 root 660 6291456 8
> 0x52594802 32769 root 660 33439744 8
> 0x52594803 65538 root 660 115343360 8
> 0x52594804 98307 root 660 44040192 8
> 0x52594805 131076 root 660 65011712 8
> 0x52594806 163845 root 660 85983232 8
> 0x52594807 196614 root 660 167772160 8
> 0x52594808 229383 informix 660 8388608 8
> 0x52594809 262152 informix 660 8388608 8
>
> [infx1210@tardis INFORMIXTMP]$ ipcs -mp
>
> ------ Shared Memory Creator/Last-op PIDs --------
> shmid owner cpid lpid
> 0 root 2547 3217
> 32769 root 2547 3217
> 65538 root 2547 3217
> 98307 root 2547 3217
> 131076 root 2547 3217
> 163845 root 2547 3217
> 196614 root 2547 3217
> 229383 informix 2547 3217
> 262152 informix 2547 3217
>
> [infx1210@tardis INFORMIXTMP]$ ps -fp 2547
> UID PID PPID C STIME TTY TIME CMD
> informix 2547 1 1 10:46 ? 00:00:09 oninit -v
> [infx1210@tardis INFORMIXTMP]$
>
> In the docs you'll find:
>
>
>
http://www.ibm.com/support/knowledgecenter/SSGU8G_12.1.0/com.ibm.admin.doc/ids_a
dmin_1218.htm?lang=en
>
> Keen regards.
>
> On Fri, 18 Mar 2016 at 06:29 medkba <medkba@gmail.com> wrote:
>
> > Dear All,
> >
> > I have running multiple instance running in one UNIX box and would like
> to
> > get which process id belongs to which on so that if any issue on the
> shared
> > memory segment allocation fail so that kill from ipcrm command.
> >
> > Please advise how to get the process id belongs to which instance
> >
> > Thank you
> >
> > --089e01295380abe96d052e4ad50c
> >
> >
> >
> >
>
>
*******************************************************************************
> > Forum Note: Use "Reply" to post a response in the discussion forum.
> >
> >
>
> --001a11c3c6d29d4466052e50ac7c
>
>
>
>
*******************************************************************************
> Forum Note: Use "Reply" to post a response in the discussion forum.
>
>
--047d7b3a982c66b27d052e5450ba
Mike, Version 11.50 FC9 HP-UX Thank you On Fri, Mar 18, 2016 at 9:37 PM, Mike Walker <mike@advancedatatools.com> wrote: > I don't know what version of Informix you're on, but you may want to see if > you have "onclean" available. It will remove those memory segments for you. > > Mike Walker > Advanced DataTools > > -----Original Message----- > From: ids-bounces@iiug.org [mailto:ids-bounces@iiug.org] On Behalf Of > medkba > Sent: Thursday, March 17, 2016 10:56 PM > To: ids@iiug.org > Subject: Identify process ID for the multiple informix .... [36776] > > Dear All, > > I have running multiple instance running in one UNIX box and would like to > get which process id belongs to which on so that if any issue on the shared > memory segment allocation fail so that kill from ipcrm command. > > Please advise how to get the process id belongs to which instance > > Thank you > > --089e01295380abe96d052e4ad50c > > > **************************************************************************** > *** > Forum Note: Use "Reply" to post a response in the discussion forum. > > > > ******************************************************************************* > Forum Note: Use "Reply" to post a response in the discussion forum. > > --089e01295380160b9d052e546612
I agree with Mr. Walker ... if your goal is to clean up shmem segs/oninit process, etc., "onclean" is great for that in most cases. It does the manual steps for cleaning up an engine that died and left remnants. Thanks - Mark Scranton The Mark Scranton Group 'All Informix ... all the time.' mark@markscranton.com
Some cases onclean not working. Then no other option. We need to clear manually Thank you for all your assistance On 19 Mar 2016 8:22 am, "MARK SCRANTON" <mark@markscranton.com> wrote: > I agree with Mr. Walker ... if your goal is to clean up shmem segs/oninit > process, etc., "onclean" is great for that in most cases. It does the > manual > steps for cleaning up an engine that died and left remnants. > > Thanks - > Mark Scranton > The Mark Scranton Group > 'All Informix ... all the time.' > mark@markscranton.com > > > > ******************************************************************************* > Forum Note: Use "Reply" to post a response in the discussion forum. > > --047d7bdca0a68b6cd9052e5ea6d3