Or, you could use a Xenomai-enabled Linux kernel. That way, Linux *is* realtime, so you will be guaranteed to get scheduled for execution every second.
Mike Dean [email protected] http://www.emacinc.com/ Engineer EMAC, Inc. 618-529-4525 Ext. 330 618-457-0110 Fax 2390 EMAC Way Carbondale, Il 62901 On Thu, Mar 6, 2014 at 1:34 PM, Michael Conrad <[email protected]>wrote: > I know this borders on bike-shedding, but if you really want to run > something exactly 60 times per elapsed minute you need to compare calls to > clock_gettime(CLOCK_MONOTONIC). Nothing else will work reliably in all > cases, and certainly not signals. (if the system is lagged significantly, > two signals can be merged into one) > > I'm not aware of any way to call clock_gettime from a shell script, but > Perl can do it. If you don't have perl and you still want it to be a > script for ease-of-maintenance, I would recommend: > > 1. write a very small C program that calls clock_gettime() for an > initial timestamp, writes "\n" on STDOUT, increment timestamp by exactly 1 > second, calls clock_gettime(), and then usleep()s for the difference > between clock_gettime and timestamp, if greater than 0. > > 2. write a script that performs "./c_prog | while read; do something(); > done" > > No special file descriptors, process IDs, signals or other mess, and > guaranteed one iteration of the script per every elapsed second (but no > guarantee that the execution occurs during that second. Linux isn't > realtime, afterall) > > -Mike > > > On 3/6/2014 9:25 AM, Yan Seiner wrote: > >> >> On 03/05/2014 10:49 PM, Harald Becker wrote: >> >>> Hi Yan ! >>> >>> On 05-03-2014 09:14 Yan Seiner <[email protected]> wrote: >>> >>>> I am trying to run a script every second. >>>> >>> Beside what Laurent told about using sleep, etc. >>> >>> first script (the one that does the work) >>>> >>>> trap 'update' HUP >>>> mknod /tmp/dummyfifo p >>>> while true; do >>>> read < /tmp/dummyfifo > /dev/null 2>&1 >>>> done >>>> The problem is that the 'read' generates a >>>> /usr/bin/update: line 1: can't open /tmp/dummyfifo: Interrupted >>>> system call >>>> >>> The reason for this is you create your pipe once, but open it >>> again at every iteration of the loop. >>> >>> Try the following: >>> >>> mknod /tmp/dummyfifo p >>> exec 0</tmp/dummyfifo 1>/dev/null 2>&1 >>> while true; do >>> read >>> done >>> >>> This opens the fifo once and assigns it for stdin. After that it >>> stays open until the first script is terminated in any way. >>> >>> In addition stdout *AND* stderr are redirected to /dev/null for >>> all following commands in the script, so you need to redirect to >>> any file or tty when you want do display something. >>> >> >> Thanks! >> >> I like it. My solution leaves 'cat' processes behind if the script gets >> killed. Usually not a problem since it's only invoked at boot. >> >> _______________________________________________ >> busybox mailing list >> [email protected] >> http://lists.busybox.net/mailman/listinfo/busybox >> > > _______________________________________________ > busybox mailing list > [email protected] > http://lists.busybox.net/mailman/listinfo/busybox >
_______________________________________________ busybox mailing list [email protected] http://lists.busybox.net/mailman/listinfo/busybox
