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

Reply via email to