1 |
NAME |
2 |
Sys::FreezeThaw - stop and start all user processes on a machine |
3 |
|
4 |
SYNOPSIS |
5 |
use Sys::FreezeThaw; |
6 |
|
7 |
Sys::FreezeThaw::freezethaw { |
8 |
# run code while system is frozen |
9 |
}; |
10 |
|
11 |
my $token = Sys::FreezeThaw::freeze; |
12 |
... do something ... |
13 |
Sys::FreezeThaw::thaw $token; |
14 |
|
15 |
DESCRIPTION |
16 |
Operating Systems/Kernels current supported: Linux-2.6/3.0 with /proc. |
17 |
|
18 |
This module implements a very specific feature: stopping(freezing and |
19 |
thawing/continuing all userspace processes on the machine. It works by |
20 |
sending SIGSTOP to all processes, parent-process first, so that the wait |
21 |
syscall will not trigger on stopped children. Restarting is done in |
22 |
reverse order. |
23 |
|
24 |
Using the combined function Sys::FreezeThaw::freezethaw is recommended |
25 |
as it will catch runtime errors, but stopping and restarting can be dine |
26 |
via separate function calls. |
27 |
|
28 |
What could it possibly be sueful for?? |
29 |
Possible uses include: doing atomic file system operations (such as |
30 |
replacing files while they are guaranteed not to be in use), or quieting |
31 |
down a system to investigate suspicious behaviour. |
32 |
|
33 |
Sys::FreezeThaw::freezethaw { BLOCK } |
34 |
First tries to stop all processes. If successful, runs the given |
35 |
code block (or code reference), then restarts all processes again. |
36 |
As the system is basically frozen during the code block execution, |
37 |
it should be as fast as possible. |
38 |
|
39 |
Runtime errors will be caught with "eval". If an exception occurs it |
40 |
will be re-thrown after processes are restarted. If processes cannot |
41 |
be frozen or restarted, this function will throw an exception. |
42 |
|
43 |
Signal handlers for SIGINT, SIGTERM, SIGPIPE, SIGHUP, SIGALRM, |
44 |
SIGUSR1 and SIGUSR2 will be installed temporarily, so if you want to |
45 |
catch these, you have to do so yourself within the executed code |
46 |
block. |
47 |
|
48 |
Try to do as few things as possible. For example, outputting text |
49 |
might cause a deadlock, as the terminal emulator on the other side |
50 |
of STDOUT might be stopped, logging to syslog might not work and so |
51 |
on. |
52 |
|
53 |
The return value of the code block is ignored right now, and the |
54 |
function doesn't yet return anything sensible. |
55 |
|
56 |
$token = Sys::FreezeThaw::freeze |
57 |
Send SIGSTOP to all processes, and return a token that allows them |
58 |
to be thawed again. |
59 |
|
60 |
If an error occurs, an exception will be thrown and all stopped |
61 |
processes will automatically be thawed. |
62 |
|
63 |
Sys::FreezeThaw::thaw $token |
64 |
Take a token returned by Sys::FreezeThaw::freeze and send all |
65 |
processes a "CONT" signal, in the order required for them not to |
66 |
receive child STOP notifications. |
67 |
|
68 |
$Sys::FreezeThaw::PARTIAL_OK |
69 |
A boolean that tells "freeze" whether it is an error if a process |
70 |
cannot be stopped. If false (the default), then "freeze" will fail |
71 |
if there is an unstoppable process. If it is true, then "freeze" |
72 |
will pretend it the process stopped. |
73 |
|
74 |
BUGS |
75 |
SIGCONT is not unnoticed by processes. Some programs (such as |
76 |
irssi-text) respond by flickering (IMHO a bug in irssi-text). Other |
77 |
programs might have other problems, but actual problems should be rare. |
78 |
However, one shouldn't overuse this module. |
79 |
|
80 |
AUTHOR |
81 |
Marc Lehmann <schmorp@schmorp.de> |
82 |
http://home.schmorp.de/ |
83 |
|