mirror of
https://github.com/pragma-/pbot.git
synced 2024-11-19 10:29:30 +01:00
compiler_vm: move some old files to misc directory
This commit is contained in:
parent
71dd7846f1
commit
7e095ee605
@ -1,4 +1,4 @@
|
|||||||
<domain type='kvm'>
|
<domain type='kvm' id='2'>
|
||||||
<name>compiler</name>
|
<name>compiler</name>
|
||||||
<uuid>a0955f41-1fb8-48b5-93ea-76319ad07c2f</uuid>
|
<uuid>a0955f41-1fb8-48b5-93ea-76319ad07c2f</uuid>
|
||||||
<memory unit='KiB'>1048576</memory>
|
<memory unit='KiB'>1048576</memory>
|
||||||
@ -48,98 +48,135 @@
|
|||||||
<source file='/var/lib/libvirt/images/compiler.qcow2'/>
|
<source file='/var/lib/libvirt/images/compiler.qcow2'/>
|
||||||
<backingStore/>
|
<backingStore/>
|
||||||
<target dev='vda' bus='virtio'/>
|
<target dev='vda' bus='virtio'/>
|
||||||
|
<alias name='virtio-disk0'/>
|
||||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
|
||||||
</disk>
|
</disk>
|
||||||
<disk type='file' device='cdrom'>
|
<disk type='file' device='cdrom'>
|
||||||
<driver name='qemu' type='raw'/>
|
<driver name='qemu'/>
|
||||||
<target dev='hda' bus='ide'/>
|
<target dev='hda' bus='ide'/>
|
||||||
<readonly/>
|
<readonly/>
|
||||||
|
<alias name='ide0-0-0'/>
|
||||||
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
|
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
|
||||||
</disk>
|
</disk>
|
||||||
<controller type='usb' index='0' model='ich9-ehci1'>
|
<controller type='usb' index='0' model='ich9-ehci1'>
|
||||||
|
<alias name='usb'/>
|
||||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x7'/>
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x7'/>
|
||||||
</controller>
|
</controller>
|
||||||
<controller type='usb' index='0' model='ich9-uhci1'>
|
<controller type='usb' index='0' model='ich9-uhci1'>
|
||||||
|
<alias name='usb'/>
|
||||||
<master startport='0'/>
|
<master startport='0'/>
|
||||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0' multifunction='on'/>
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0' multifunction='on'/>
|
||||||
</controller>
|
</controller>
|
||||||
<controller type='usb' index='0' model='ich9-uhci2'>
|
<controller type='usb' index='0' model='ich9-uhci2'>
|
||||||
|
<alias name='usb'/>
|
||||||
<master startport='2'/>
|
<master startport='2'/>
|
||||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x1'/>
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x1'/>
|
||||||
</controller>
|
</controller>
|
||||||
<controller type='usb' index='0' model='ich9-uhci3'>
|
<controller type='usb' index='0' model='ich9-uhci3'>
|
||||||
|
<alias name='usb'/>
|
||||||
<master startport='4'/>
|
<master startport='4'/>
|
||||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x2'/>
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x2'/>
|
||||||
</controller>
|
</controller>
|
||||||
<controller type='ide' index='0'>
|
<controller type='ide' index='0'>
|
||||||
|
<alias name='ide'/>
|
||||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
|
||||||
</controller>
|
</controller>
|
||||||
<controller type='virtio-serial' index='0'>
|
<controller type='virtio-serial' index='0'>
|
||||||
|
<alias name='virtio-serial0'/>
|
||||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
|
||||||
</controller>
|
</controller>
|
||||||
<controller type='pci' index='0' model='pci-root'/>
|
<controller type='pci' index='0' model='pci-root'>
|
||||||
|
<alias name='pci.0'/>
|
||||||
|
</controller>
|
||||||
<interface type='network'>
|
<interface type='network'>
|
||||||
<mac address='52:54:00:f3:c6:38'/>
|
<mac address='52:54:00:f3:c6:38'/>
|
||||||
<source network='default'/>
|
<source network='default' bridge='virbr0'/>
|
||||||
|
<target dev='vnet0'/>
|
||||||
<model type='virtio'/>
|
<model type='virtio'/>
|
||||||
|
<alias name='net0'/>
|
||||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
|
||||||
</interface>
|
</interface>
|
||||||
<serial type='tcp'>
|
<serial type='tcp'>
|
||||||
<source mode='bind' host='127.0.0.1' service='3333'/>
|
<source mode='bind' host='127.0.0.1' service='3333' tls='no'/>
|
||||||
<protocol type='telnet'/>
|
<protocol type='telnet'/>
|
||||||
<target type='isa-serial' port='0'>
|
<target type='isa-serial' port='0'>
|
||||||
<model name='isa-serial'/>
|
<model name='isa-serial'/>
|
||||||
</target>
|
</target>
|
||||||
|
<alias name='serial0'/>
|
||||||
</serial>
|
</serial>
|
||||||
<serial type='tcp'>
|
<serial type='tcp'>
|
||||||
<source mode='bind' host='127.0.0.1' service='3336'/>
|
<source mode='bind' host='127.0.0.1' service='3336' tls='no'/>
|
||||||
<protocol type='telnet'/>
|
<protocol type='telnet'/>
|
||||||
<target type='isa-serial' port='1'>
|
<target type='isa-serial' port='1'>
|
||||||
<model name='isa-serial'/>
|
<model name='isa-serial'/>
|
||||||
</target>
|
</target>
|
||||||
|
<alias name='serial1'/>
|
||||||
</serial>
|
</serial>
|
||||||
<console type='tcp'>
|
<console type='tcp'>
|
||||||
<source mode='bind' host='127.0.0.1' service='3333'/>
|
<source mode='bind' host='127.0.0.1' service='3333' tls='no'/>
|
||||||
<protocol type='telnet'/>
|
<protocol type='telnet'/>
|
||||||
<target type='serial' port='0'/>
|
<target type='serial' port='0'/>
|
||||||
|
<alias name='serial0'/>
|
||||||
</console>
|
</console>
|
||||||
<channel type='unix'>
|
<channel type='unix'>
|
||||||
<target type='virtio' name='org.qemu.guest_agent.0'/>
|
<source mode='bind' path='/var/lib/libvirt/qemu/channel/target/domain-2-compiler/org.qemu.guest_agent.0'/>
|
||||||
|
<target type='virtio' name='org.qemu.guest_agent.0' state='connected'/>
|
||||||
|
<alias name='channel0'/>
|
||||||
<address type='virtio-serial' controller='0' bus='0' port='1'/>
|
<address type='virtio-serial' controller='0' bus='0' port='1'/>
|
||||||
</channel>
|
</channel>
|
||||||
<channel type='spicevmc'>
|
<channel type='spicevmc'>
|
||||||
<target type='virtio' name='com.redhat.spice.0'/>
|
<target type='virtio' name='com.redhat.spice.0' state='disconnected'/>
|
||||||
|
<alias name='channel1'/>
|
||||||
<address type='virtio-serial' controller='0' bus='0' port='2'/>
|
<address type='virtio-serial' controller='0' bus='0' port='2'/>
|
||||||
</channel>
|
</channel>
|
||||||
<input type='tablet' bus='usb'>
|
<input type='tablet' bus='usb'>
|
||||||
|
<alias name='input0'/>
|
||||||
<address type='usb' bus='0' port='1'/>
|
<address type='usb' bus='0' port='1'/>
|
||||||
</input>
|
</input>
|
||||||
<input type='mouse' bus='ps2'/>
|
<input type='mouse' bus='ps2'>
|
||||||
<input type='keyboard' bus='ps2'/>
|
<alias name='input1'/>
|
||||||
<graphics type='spice' autoport='yes'>
|
</input>
|
||||||
<listen type='address'/>
|
<input type='keyboard' bus='ps2'>
|
||||||
|
<alias name='input2'/>
|
||||||
|
</input>
|
||||||
|
<graphics type='spice' port='5900' autoport='yes' listen='127.0.0.1'>
|
||||||
|
<listen type='address' address='127.0.0.1'/>
|
||||||
<image compression='off'/>
|
<image compression='off'/>
|
||||||
</graphics>
|
</graphics>
|
||||||
<sound model='ich6'>
|
<sound model='ich6'>
|
||||||
|
<alias name='sound0'/>
|
||||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
|
||||||
</sound>
|
</sound>
|
||||||
<video>
|
<video>
|
||||||
<model type='cirrus' vram='16384' heads='1' primary='yes'/>
|
<model type='cirrus' vram='16384' heads='1' primary='yes'/>
|
||||||
|
<alias name='video0'/>
|
||||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
|
||||||
</video>
|
</video>
|
||||||
<redirdev bus='usb' type='spicevmc'>
|
<redirdev bus='usb' type='spicevmc'>
|
||||||
|
<alias name='redir0'/>
|
||||||
<address type='usb' bus='0' port='2'/>
|
<address type='usb' bus='0' port='2'/>
|
||||||
</redirdev>
|
</redirdev>
|
||||||
<redirdev bus='usb' type='spicevmc'>
|
<redirdev bus='usb' type='spicevmc'>
|
||||||
|
<alias name='redir1'/>
|
||||||
<address type='usb' bus='0' port='3'/>
|
<address type='usb' bus='0' port='3'/>
|
||||||
</redirdev>
|
</redirdev>
|
||||||
<memballoon model='virtio'>
|
<memballoon model='virtio'>
|
||||||
|
<alias name='balloon0'/>
|
||||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
|
||||||
</memballoon>
|
</memballoon>
|
||||||
<rng model='virtio'>
|
<rng model='virtio'>
|
||||||
<backend model='random'>/dev/urandom</backend>
|
<backend model='random'>/dev/urandom</backend>
|
||||||
|
<alias name='rng0'/>
|
||||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>
|
||||||
</rng>
|
</rng>
|
||||||
</devices>
|
</devices>
|
||||||
<seclabel type='dynamic' model='apparmor' relabel='yes'/>
|
<seclabel type='dynamic' model='apparmor' relabel='yes'>
|
||||||
|
<label>libvirt-a0955f41-1fb8-48b5-93ea-76319ad07c2f</label>
|
||||||
|
<imagelabel>libvirt-a0955f41-1fb8-48b5-93ea-76319ad07c2f</imagelabel>
|
||||||
|
</seclabel>
|
||||||
|
<seclabel type='dynamic' model='dac' relabel='yes'>
|
||||||
|
<label>+64055:+130</label>
|
||||||
|
<imagelabel>+64055:+130</imagelabel>
|
||||||
|
</seclabel>
|
||||||
</domain>
|
</domain>
|
||||||
|
|
||||||
|
280
modules/compiler_vm/misc/compiler_server_qemu_win32.pl
Executable file
280
modules/compiler_vm/misc/compiler_server_qemu_win32.pl
Executable file
@ -0,0 +1,280 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
use warnings;
|
||||||
|
use strict;
|
||||||
|
|
||||||
|
use IO::Socket;
|
||||||
|
use Net::hostent;
|
||||||
|
#use IPC::Shareable;
|
||||||
|
use Win32::MMF::Shareable;
|
||||||
|
|
||||||
|
my $fh = select STDOUT;
|
||||||
|
$| = 1;
|
||||||
|
select $fh;
|
||||||
|
|
||||||
|
my $SERVER_PORT = 9000;
|
||||||
|
my $MONITOR_PORT = 3335;
|
||||||
|
my $SERIAL_PORT = 3333;
|
||||||
|
my $HEARTBEAT_PORT = 3336;
|
||||||
|
|
||||||
|
my $COMPILE_TIMEOUT = 10;
|
||||||
|
my $NOGRAPHIC = 0;
|
||||||
|
|
||||||
|
sub server_listen {
|
||||||
|
my $port = shift @_;
|
||||||
|
|
||||||
|
my $server = IO::Socket::INET->new(
|
||||||
|
Proto => 'tcp',
|
||||||
|
LocalPort => $port,
|
||||||
|
Listen => SOMAXCONN,
|
||||||
|
Reuse => 1);
|
||||||
|
|
||||||
|
die "can't setup server: $!" unless $server;
|
||||||
|
|
||||||
|
print "[Server $0 accepting clients]\n";
|
||||||
|
|
||||||
|
return $server;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub vm_stop {
|
||||||
|
my $pid = shift @_;
|
||||||
|
return if not defined $pid;
|
||||||
|
kill 9, $pid;
|
||||||
|
waitpid($pid, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub vm_start {
|
||||||
|
my $pid = fork;
|
||||||
|
|
||||||
|
if(not defined $pid) {
|
||||||
|
die "fork failed: $!";
|
||||||
|
}
|
||||||
|
|
||||||
|
if($pid == 0) {
|
||||||
|
print "\nStarting qemu\n";
|
||||||
|
my $command = "/cygdrive/e/Downloads/qemu-1.5.0-win32-sdl.tar/qemu-1.5.0-win32-sdl/qemu-system-x86_64.exe -net none -hda c-snap.img -m 128 -monitor tcp:127.0.0.1:$MONITOR_PORT,server,nowait -serial tcp:127.0.0.1:$SERIAL_PORT,server,nowait -serial tcp:127.0.0.1:$HEARTBEAT_PORT,server -boot c -loadvm 1" . ($NOGRAPHIC ? " -nographic" : "");
|
||||||
|
my @command_list = split / /, $command;
|
||||||
|
exec(@command_list);
|
||||||
|
} else {
|
||||||
|
return $pid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub vm_reset {
|
||||||
|
use IO::Socket;
|
||||||
|
|
||||||
|
print "Resetting vm\n";
|
||||||
|
my $sock = IO::Socket::INET->new(PeerAddr => '127.0.0.1', PeerPort => $MONITOR_PORT, Prot => 'tcp');
|
||||||
|
if(not defined $sock) {
|
||||||
|
print "[vm_reset] Unable to connect to monitor: $!\n";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
print $sock "loadvm 1\n";
|
||||||
|
close $sock;
|
||||||
|
print "Reset vm\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
sub execute {
|
||||||
|
my ($cmdline) = @_;
|
||||||
|
|
||||||
|
print "execute($cmdline)\n";
|
||||||
|
|
||||||
|
my ($ret, $result);
|
||||||
|
|
||||||
|
my $child = fork;
|
||||||
|
|
||||||
|
if($child == 0) {
|
||||||
|
($ret, $result) = eval {
|
||||||
|
my $result = '';
|
||||||
|
|
||||||
|
my $pid = open(my $fh, '-|', "$cmdline 2>&1");
|
||||||
|
|
||||||
|
local $SIG{ALRM} = sub { print "Time out\n"; kill 9, $pid; die "Timed-out: $result\n"; };
|
||||||
|
alarm($COMPILE_TIMEOUT);
|
||||||
|
|
||||||
|
while(my $line = <$fh>) {
|
||||||
|
$result .= $line;
|
||||||
|
}
|
||||||
|
|
||||||
|
close $fh;
|
||||||
|
|
||||||
|
my $ret = $? >> 8;
|
||||||
|
alarm 0;
|
||||||
|
#print "[$ret, $result]\n";
|
||||||
|
return ($ret, $result);
|
||||||
|
};
|
||||||
|
|
||||||
|
alarm 0;
|
||||||
|
if($@ =~ /Timed-out: (.*)/) {
|
||||||
|
return (-13, "[Timed-out] $1");
|
||||||
|
}
|
||||||
|
|
||||||
|
return ($ret, $result);
|
||||||
|
} else {
|
||||||
|
waitpid($child, 0);
|
||||||
|
my $result = $? >> 8;
|
||||||
|
print "child exited, parent continuing [result = $result]\n";
|
||||||
|
return (undef, $result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub compiler_server {
|
||||||
|
my ($server, $heartbeat_pid, $heartbeat_monitor);
|
||||||
|
|
||||||
|
while(1) {
|
||||||
|
my $vm_pid = vm_start;
|
||||||
|
print "vm started pid: $vm_pid\n";
|
||||||
|
|
||||||
|
|
||||||
|
$heartbeat_pid = fork;
|
||||||
|
die "Fork failed: $!" if not defined $heartbeat_pid;
|
||||||
|
|
||||||
|
if($heartbeat_pid == 0) {
|
||||||
|
tie my $heartbeat, 'Win32::MMF::Shareable', 'dat1';
|
||||||
|
tie my $running, 'Win32::MMF::Shareable', 'dat2';
|
||||||
|
|
||||||
|
|
||||||
|
print "in child: running: " . (defined $running ? $running : "undefined"). "\n";
|
||||||
|
|
||||||
|
while(not defined $running) {
|
||||||
|
print "Child waiting for running status\n";
|
||||||
|
sleep 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
$heartbeat_monitor = undef;
|
||||||
|
while(not $heartbeat_monitor) {
|
||||||
|
print "Connecting to heartbeat ...";
|
||||||
|
$heartbeat_monitor = IO::Socket::INET->new(PeerAddr => '127.0.0.1', PeerPort => $HEARTBEAT_PORT, Proto => 'tcp', Type => SOCK_STREAM);
|
||||||
|
if(not $heartbeat_monitor) {
|
||||||
|
print " failed.\n";
|
||||||
|
sleep 2;
|
||||||
|
} else {
|
||||||
|
print " success!\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
print "child: running: $running\n";
|
||||||
|
|
||||||
|
while($running and <$heartbeat_monitor>) {
|
||||||
|
$heartbeat = 1;
|
||||||
|
print ".";
|
||||||
|
}
|
||||||
|
|
||||||
|
$heartbeat_monitor->shutdown(2);
|
||||||
|
$heartbeat = 0;
|
||||||
|
print "child no longer running\n";
|
||||||
|
exit;
|
||||||
|
} else {
|
||||||
|
tie my $heartbeat, 'Win32::MMF::Shareable', 'dat1';
|
||||||
|
tie my $running, 'Win32::MMF::Shareable', 'dat2';
|
||||||
|
|
||||||
|
$running = 1;
|
||||||
|
$heartbeat = 0;
|
||||||
|
|
||||||
|
if(not defined $server) {
|
||||||
|
print "Starting compiler server on port $SERVER_PORT\n";
|
||||||
|
$server = server_listen($SERVER_PORT);
|
||||||
|
} else {
|
||||||
|
print "Compiler server already listening on port $SERVER_PORT\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
print "parent: running: $running\n";
|
||||||
|
|
||||||
|
while ($running and my $client = $server->accept()) {
|
||||||
|
$client->autoflush(1);
|
||||||
|
my $hostinfo = gethostbyaddr($client->peeraddr);
|
||||||
|
print '-' x 20, "\n";
|
||||||
|
printf "[Connect from %s at %s]\n", $client->peerhost, scalar localtime;
|
||||||
|
my $timed_out = 0;
|
||||||
|
my $killed = 0;
|
||||||
|
|
||||||
|
eval {
|
||||||
|
my $lang;
|
||||||
|
my $nick;
|
||||||
|
my $channel;
|
||||||
|
my $code = "";
|
||||||
|
|
||||||
|
local $SIG{ALRM} = sub { die 'Timed-out'; };
|
||||||
|
alarm 5;
|
||||||
|
|
||||||
|
while (my $line = <$client>) {
|
||||||
|
$line =~ s/[\r\n]+$//;
|
||||||
|
next if $line =~ m/^\s*$/;
|
||||||
|
alarm 5;
|
||||||
|
print "got: [$line]\n";
|
||||||
|
|
||||||
|
if($line =~ m/^compile:end$/) {
|
||||||
|
if($heartbeat == 0) {
|
||||||
|
print "No heartbeat yet, ignoring compile attempt.\n";
|
||||||
|
print $client "$nick: Recovering from previous snippet, please wait.\n";
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
|
||||||
|
print "Attempting compile...\n";
|
||||||
|
alarm 0;
|
||||||
|
|
||||||
|
my ($ret, $result) = execute("./compiler_vm_client.pl \Q$nick\E \Q$channel\E -lang=\Q$lang\E \Q$code\E");
|
||||||
|
|
||||||
|
if(not defined $ret) {
|
||||||
|
#print "parent continued\n";
|
||||||
|
print "parent continued [$result]\n";
|
||||||
|
$timed_out = 1 if $result == 243; # -13 == 243
|
||||||
|
$killed = 1 if $result == 242; # -14 = 242
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
|
||||||
|
$result =~ s/\s+$//;
|
||||||
|
print "Ret: $ret; result: [$result]\n";
|
||||||
|
|
||||||
|
if($result =~ m/\[Killed\]$/) {
|
||||||
|
print "Process was killed\n";
|
||||||
|
$killed = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if($ret == -13) {
|
||||||
|
print $client "$nick: ";
|
||||||
|
}
|
||||||
|
|
||||||
|
print $client $result . "\n";
|
||||||
|
close $client;
|
||||||
|
|
||||||
|
$ret = -14 if $killed;
|
||||||
|
|
||||||
|
# child exit
|
||||||
|
print "child exit\n";
|
||||||
|
exit $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
if($line =~ /compile:([^:]+):([^:]+):(.*)$/) {
|
||||||
|
$nick = $1;
|
||||||
|
$channel = $2;
|
||||||
|
$lang = $3;
|
||||||
|
$code = "";
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
|
$code .= $line . "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
alarm 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
alarm 0;
|
||||||
|
|
||||||
|
close $client;
|
||||||
|
|
||||||
|
next unless ($timed_out);
|
||||||
|
|
||||||
|
print "stopping vm $vm_pid\n";
|
||||||
|
vm_stop $vm_pid;
|
||||||
|
$running = 0;
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
print "Compiler server no longer running, restarting...\n";
|
||||||
|
}
|
||||||
|
waitpid($heartbeat_pid, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
compiler_server;
|
Loading…
Reference in New Issue
Block a user