質問

I have this code copied from linuxaria.com as example and work just fine on my case the problem is when I exit from terminal inotifywait stop. I want run on back ground even after exit the terminal. how I can do that?

#!/bin/sh

# CONFIGURATION
DIR="/tmp"
EVENTS="create"
FIFO="/tmp/inotify2.fifo"


on_event() {
  local date=$1
  local time=$2
  local file=$3

  sleep 5

  echo "$date $time Fichier créé: $file"
}

# MAIN
if [ ! -e "$FIFO" ]
then
  mkfifo "$FIFO"
fi

inotifywait -m -e "$EVENTS" --timefmt '%Y-%m-%d %H:%M:%S' --format '%T %f' "$DIR" >       "$FIFO" &
INOTIFY_PID=$!


while read date time file
do
  on_event $date $time $file &
done < "$FIFO"
役に立ちましたか?

解決 2

You can run the script with screen or nohup but I'm not sure how that would help since the script does not appear to log its output to any file.

nohup bash script.sh </dev/null >/dev/null 2>&1 &

Or

screen -dm bash script.sh </dev/null >/dev/null 2>&1 &

Disown could also apply:

bash script.sh </dev/null >/dev/null 2>&1 & disown

You should just test which one would not allow the command to suspend or hang up when the terminal exits.

If you want to log the output to a file, you can try these versions:

nohup bash script.sh </dev/null >/path/to/logfile 2>&1 &
screen -dm bash script.sh </dev/null >/path/to/logfile 2>&1 &
bash script.sh </dev/null >/path/to/logfile 2>&1 & disown

他のヒント

I made a 'service' out of it. So I could stop/start it like a normal service and also it would start after a reboot:

This was made on a Centos distro So I'm not if it works on others right away.

Create a file with execute right on in the service directory

/etc/init.d/servicename

#!/bin/bash

# chkconfig: 2345 90 60

case "$1" in
start)
   nohup SCRIPT.SH > /dev/null 2>&1 &
   echo $!>/var/run/SCRIPT.SH.pid
   ;;
stop)
   pkill -P `cat /var/run/SCRIPT.SH.pid`
   rm /var/run/SCRIPT.SH.pid
   ;;
restart)
   $0 stop
   $0 start
   ;;
status)
   if [ -e /var/run/SCRIPT.SH.pid ]; then
      echo SCRIPT.SH is running, pid=`cat /var/run/SCRIPT.SH.pid`
   else
      echo SCRIPT.SH is not running
      exit 1
   fi
   ;;
*)
   echo "Usage: $0 {start|stop|status|restart}"
esac

exit 0

Everything in caps you should change to what your script name.

The line # chkconfig: 2345 90 60 makes it possible to start the service when the system is rebooted. this probably doens't work in ubuntu like distro's.

replace -m with

-d -o /dev/null

ie:

inotifywait -d -o /dev/null -e "$EVENTS" --timefmt '%Y-%m-%d %H:%M:%S' --format '%T %f' >"$DIR" > "$FIFO" & INOTIFY_PID=$!

You can check the inotifywait help manual at:

https://helpmanual.io/help/inotifywait/

The best way I found is to create a systemd service.

Create systemd file in /lib/systemd/system/checkfile.service:

sudo vim /lib/systemd/system/checkfile.service

And paste this there:

[Unit]
Description = Run inotifywait in backgoround

[Service]
User=ubuntu
Group=ubuntu
ExecStart=/bin/bash /path_to/script.sh
RestartSec=10

[Install]
WantedBy=multi-user.target

and in /path_to/script.sh, you can have this:

inotifywait -m /path-to-dir -e create -e moved_to |
    while read dir action file; do
        echo "The file '$file' appeared in directory '$dir' via '$action'" >> /dir/event.txt
    done

Make sure that your file is executable by the user:

sudo chmod +x /path_to/script.sh

After creating two files, reload systemd manager configuration with:

sudo systemctl daemon-reload

Now you can use start/stop/enable to your script:

sudo systemctl enable checkfile
sudo systemctl start checkfile

Make sure to replace file/directory/user/group values before executing.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top