Path: utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!csd4.milw.wisc.edu!dogie.macc.wisc.edu!uwvax!tank!mimsy!chris From: chris@mimsy.UUCP (Chris Torek) Newsgroups: comp.unix.questions Subject: Re: Starting Remote Jobs Message-ID: <17415@mimsy.UUCP> Date: 10 May 89 12:51:30 GMT References: <815@usl.usl.edu> Organization: U of Maryland, Dept. of Computer Science, Coll. Pk., MD 20742 Lines: 107 In article <815@usl.usl.edu> pcb@usl.usl.edu (Peter C. Bahrs) writes: >How can I start a remote background job? > >I have tried: > rsh machine 'program &' this waits on my local machine for termination Not exactly. Rather, it waits on your local machine for end-of-file (for the `pipe' [socket] it opens to the remote machine to indicate that that program is done sending output back). What you must do, then, is convince `program' to close all its open file descriptors (which are dup()s of that socket) before doing anything else. If your remote shell is `sh': rsh machine 'exec program /dev/null 2>&1 &' If your remote shell is `csh': rsh machine 'exec program &/dev/null &' If your remote shell is unknown: rsh machine 'quietly exec program' # program is run by sh, may contain redirections, etc. where `quietly' is as shown below (comments left as an exercise to the reader :-) ). N.B.: if you do not have strerror(), complain to your vendor and/or use char *strerror(e) int e; { static char u[40]; extern int sys_nerr; extern char *sys_errlist[]; if ((unsigned)e >= sys_nerr) { (void) sprintf(u, "unknown error code %d", e); return (u); } return (sys_errlist[e]); } (if it works, put it in your C library). #include extern int errno; char *strcpy(), *strerror(), *malloc(); char *copy(); main(argc, argv) int argc; char **argv; { char *cmd; if (argc < 2) { fprintf(stderr, "usage: quietly prog [args ...]\n"); exit(2); } cmd = copy(argc - 1, argv + 1); switch (fork()) { case 0: closeall(); execl("/bin/sh", "sh", "-c", cmd, (char *)NULL); _exit(1); /* cannot complain anymore */ /* NOTREACHED */ case -1: fprintf(stderr, "quietly: cannot fork: %s\n", strerror(errno)); exit(1); /* default: parent */ } exit(0); } closeall() { register int i; for (i = getdtablesize(); --i >= 0;) (void) close(i); } char * copy(ac, av) int ac; char **av; { register char **p, *m; register int l = 0, n; for (p = av, n = ac; --n >= 0;) l += strlen(*p++) + 1; if ((m = malloc((unsigned)l)) == NULL) { fprintf(stderr, "quietly: cannot allocate %d bytes: %s\n", l, strerror(errno)); exit(1); } for (p = av, n = ac; --n >= 0;) { m += strlen(strcpy(m, *p++)); *m++ = ' '; } m[-1] = '\0'; return (m - l); } -- In-Real-Life: Chris Torek, Univ of MD Comp Sci Dept (+1 301 454 7163) Domain: chris@mimsy.umd.edu Path: uunet!mimsy!chris