The question is published on by Tutorial Guruji team.
I’m trying to write a shell script that will wait for a file to appear in the
/tmp directory called
sleep.txt and once it is found the program will cease, otherwise I want the program to be in a sleep (suspended) state until the file is located. Now, I’m assuming that I will use a test command. So, something like
(if [ -f "/tmp/sleep.txt" ]; then stop else sleep.)
I’m brand new to writing shell script and any help is greatly appreciated!
Under Linux, you can use the inotify kernel subsystem to efficiently wait for the appearance of a file in a directory:
while read i; do if [ "$i" = sleep.txt ]; then break; fi; done < <(inotifywait -e create,open --format '%f' --quiet /tmp --monitor) # script execution continues ...
(assuming Bash for the
<() output redirection syntax)
The advantage of this approach in comparison to fixed time interval polling like in
while [ ! -f /tmp/sleep.txt ]; do sleep 1; done # script execution continues ...
is that the kernel sleeps more. With an inotify event specification like
create,open the script is just scheduled for execution when a file under
/tmp is created or opened. With the fixed time interval polling you waste CPU cycles for each time increment.
I included the
open event to also register
touch /tmp/sleep.txt when the file already exists.