[RndTbl] Ksh scripting, named pipes

Adam Thompson athompso at athompso.net
Sat Mar 1 14:12:46 CST 2014


Oh, it's obvious when I think about it - the behavior of a pipe with multiple readers is well-defined as being OS and clib-dependent.
Each byte is only available to one reader, ever - if the reading is interleaved, each reader will get garbage.
You can use tee(1) to write to multiple FIFOs at once, or just adapt the writing script to do so manually.
-Adam

On Mar 1, 2014 1:35 PM, Kevin McGregor <kevin.a.mcgregor at gmail.com> wrote:
>
> The writer is:
> #/bin/ksh
> PIPE=/tmp/backup.pipe
> [[ ! -a $PIPE ]] && mkfifo $PIPE
> # Start gzip processes
> /opt/cronjobs/zip1 &
> /opt/cronjobs/zip2 &
>
> # Process files needing compression
> let 'fc=0'
> ls /zonebackup/*tar | while read F; do
>         echo $F >$PIPE
>         let 'fc=fc+1'
> done
>
> echo "end of list" >$PIPE
> echo "end of list" >$PIPE
> exit 0
>
> The readers are:
> #/bin/ksh
> PIPE=/tmp/backup.pipe
> NAME=zip1
> if [[ ! -a $PIPE ]]; then
>         logger -p local0.warning "$NAME can't find $PIPE -- exiting"
>         exit 1
> fi
>
> while (( 1 )); do
>         read F <$PIPE
>         if [[ "$F" = "end of list" ]]; then
>                 break
>         else
>                 echo "$NAME: $F"
>         fi
> done
>
>
>
> On Sat, Mar 1, 2014 at 1:29 PM, Kevin McGregor <kevin.a.mcgregor at gmail.com> wrote:
>>
>> I tried fiddling with IFS to no avail. I just changed it like this:
>> IFS='
>> '
>> And now the readers show all kinds of gibberish! All lines have no whitespace, save for the newline at the end. I'm assuming it's at the end. 
>>
>>
>> On Sat, Mar 1, 2014 at 12:47 PM, Robert Keizer <robert at keizer.ca> wrote:
>>>
>>> Have you tried setting IFS ( field sep )? Also you could enable raw mode with -r.
>>>
>>> Can you share the script?
>>>
>>> Are the same lines failing repeatedly?
>>>
>>> Rob
>>>
>>> On 2014-03-01 11:55 AM, "Kevin McGregor" <kevin.a.mcgregor at gmail.com> wrote:
>>>>
>>>> I have a main script which writes to a named pipe. Before it starts writing, it starts two other scripts which read from this pipe. The reading and writing is a list of file names, one per line. How do I ensure that each script reads one complete line from the pipe at a time (no more, no less)?
>>>>
>>>> I have a test set up, and it usually works, but sometimes a reader will get a blank line or just a "/" (but not any other part of a line)!
>>>>
>>>> Kevin
>>>>
>>>> _______________________________________________
>>>> Roundtable mailing list
>>>> Roundtable at muug.mb.ca
>>>> http://www.muug.mb.ca/mailman/listinfo/roundtable
>>>>
>>>
>>> _______________________________________________
>>> Roundtable mailing list
>>> Roundtable at muug.mb.ca
>>> http://www.muug.mb.ca/mailman/listinfo/roundtable
>>>
>>
>



More information about the Roundtable mailing list