https://github.com/buganini/rcexecr
Parallel rc.d scripts executer for FreeBSD
https://github.com/buganini/rcexecr
Last synced: about 1 year ago
JSON representation
Parallel rc.d scripts executer for FreeBSD
- Host: GitHub
- URL: https://github.com/buganini/rcexecr
- Owner: buganini
- Created: 2011-06-01T06:49:29.000Z (about 15 years ago)
- Default Branch: master
- Last Pushed: 2012-12-23T14:10:21.000Z (over 13 years ago)
- Last Synced: 2025-02-17T14:44:38.678Z (over 1 year ago)
- Language: C
- Homepage:
- Size: 175 KB
- Stars: 4
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README
Awesome Lists containing this project
README
rcexecr is modified from rcorder(8) from freebsd(/netbsd)
It aims to do things that rcorder and part of /etc/rc do in parallel.
Test with modification on /etc:
#install
cd /usr/src/sbin/
git clone git://github.com/buganini/rcexecr.git
cd rcexecr
sudo make all install
#patch /etc
cd /etc/
patch -p1 < /usr/src/sbin/rcexecr/etc.patch.txt
#enable parallel execution
echo rcexecr_parallel="YES" >> /etc/rc.conf
#reboot
shutdown -r now
Test without affecting system:
cd /usr/src/sbin/
git clone git://github.com/buganini/rcexecr.git
cd rcexecr
sudo make
env ARG0=\? ARG1=start./rcexecr /etc/rc.d/*
env ARG0=\? ARG1=stop ./rcexecr -r /etc/rc.d/*
#add -x to actually execute
env ARG0=\? ./rcexecr -x testcase/rc.d/*
#test self modification
chmod -R 755 testcase/
env ARG0=\? ./rcexecr -x testcase/rc.d/*
Progress:
beg/end calculation: done
fork/exec/waitpid/-x(execute, or dry print): done
-r(reverse, for /etc/rc.shutdown): done
self modification: done
patch for /etc: done
update document: partial
Concept:
beg/end: the proper timing to launch script / wait it finished.
When a node's requirement is satisfied, it would be launched by fork()+exec().
When a node is required to be done, it would be waited for by waitpid().
the whole schedule is reversed with -r.
Circular dependency detecting:
see https://github.com/buganini/rcexecr/commit/8460c6006dd041fe4920047ee80c3bd19896f493
Self modification:
consider the dependencies as a graph, the files as nodes,
when subprocess exec(rcexecr), the node take whole graph as input,
and regenerate it with adding new node.
approach:
if (getenv("RCEXECR")!=NULL) {
//send new items to the nexus by writing to pipe.
exit(0);
} else {
setenv("RCEXECR", pipe-fd);
}
after receiving new items, call regenerate(),
which exit() directly.
Todo:
zombieskiller (but this need another mapping and lookup)