next up previous
Next: A.36 vc-recv.setl Up: A. WEBeye Source Code Previous: A.34 vc-push.setl

  
A.35 vc-quit.setl

Called by parent program:
vc-restart.setl     (Section A.37 [vc-restart.setl])

Textually #includes:
vc-admin.setl     (Section A.1 [vc-admin.setl])

Source code: *

const yhwh = `vc-quit.setl';
 
-- Stop the Box
 
const my_lock = `vc-quitting';  -- lock file (mutex)
const pid_dir = `vc-pid';
const main_pid_file = pid_dir + `/vc-toplev';
const ps_cmd = `ps alxwwj';  --- use `ps -edalfj' on Solaris
 
commence;  -- acquire mutex or exit abnormally right away
 
if fexists main_pid_file then
  relieve (main_pid_filetrue);
else
  msg (`Pid record "'+main_pid_file+`" not found.');
  -- But that's no reason to abandon the cleanup effort early...
end if;
 
-- If relieve executed, everything should now be cleaned out, but
-- just to make extra sure...
if fexists pid_dir then
  for pid_file in split (filter (`echo '+pid_dir+`/*')) |
      pid_file notin {`', pid_dir+`/*'} loop
    relieve (pid_filefalse);
  end loop;
else
  msg (`Directory "'+pid_dir+`" doesn''t exist???');
  msg (`Something is seriously broken in this installation!');
  msg (`Abending.');
  finis (1);
end if;
 
msg (`Calling '+str ps_cmd+` ...');
system (ps_cmd);
msg (`Done.');
 
finis (0);  -- release mutex and exit normally
 
proc relieve (pid_filecomplain_if_not_found);
  id := val (getfile pid_file ? `0');
  if not is_integer id or id <= 0 or id >= 2**31 then
    msg (`File '+str pid_file+` does not contain a valid process id!');
  elseif pexists id then
    msg (`Sending TERM signal to pid '+str id+` ...');
    kill (id);  -- the process is supposed to propagate this signal
    -- Wait up to 10 seconds for the process to go away
    loop for i in {1..100} while pexists id do
      select (om, 100);
    end loop;
    -- Clear out anything in the process's process group, in case it
    -- or any of its components orphaned any children
    msg (`Sending TERM to process group '+str id+` ...');
    kill (-id);
    -- Give that polite signal 1414 ms to take effect
    select (om, 1414);
    -- Blast away any misguided limpets
    msg (`Sending KILL to process group '+str id+` ...');
    kill (-id, `KILL');
  elseif complain_if_not_found then
    msg (`Process id '+str id+` not found.');
  end if;
end proc relieve;
 
#include ``vc-admin.setl''


next up previous
Next: A.36 vc-recv.setl Up: A. WEBeye Source Code Previous: A.34 vc-push.setl
David Bacon
1999-12-10