首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在后台运行inotifywait等待

在后台运行inotifywait等待
EN

Stack Overflow用户
提问于 2013-09-19 17:47:29
回答 5查看 10.5K关注 0票数 6

我以从linuxaria.com复制的代码为例,在我的情况下工作得很好,问题是当我退出终端inotifywait停止时。即使在离开终点站后我也要跑到后面去。我怎么能这么做?

代码语言:javascript
复制
#!/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"
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-09-19 17:51:33

您可以使用screennohup运行脚本,但我不确定这会有什么帮助,因为脚本似乎不会将其输出记录到任何文件。

代码语言:javascript
复制
nohup bash script.sh </dev/null >/dev/null 2>&1 &

代码语言:javascript
复制
screen -dm bash script.sh </dev/null >/dev/null 2>&1 &

不承认也可适用于:

代码语言:javascript
复制
bash script.sh </dev/null >/dev/null 2>&1 & disown

您应该只测试哪个命令在终端退出时不允许命令挂起或挂起。

如果要将输出记录到文件,可以尝试以下版本:

代码语言:javascript
复制
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
票数 6
EN

Stack Overflow用户

发布于 2016-09-09 10:43:08

我从中得到了一份“服务”。因此,我可以像正常服务一样停止/启动它,也可以在重新启动之后启动它:

这是在Centos发行版上制作的,所以如果它马上对其他人有效的话,我就不会了。

在服务目录中创建一个具有执行权限的文件

/etc/init.d/servicename

代码语言:javascript
复制
#!/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

大写的每一件事,你都应该改为你的脚本名。

# chkconfig: 2345 90 60使在重新启动系统时启动服务成为可能。这可能不像发行版那样在ubuntu起作用。

票数 7
EN

Stack Overflow用户

发布于 2021-08-10 09:37:06

我发现最好的方法是创建一个systemd服务。

/lib/systemd/system/checkfile.service中创建systemd文件

代码语言:javascript
复制
sudo vim /lib/systemd/system/checkfile.service

然后粘贴在这里:

代码语言:javascript
复制
[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

/path_to/script.sh中,您可以拥有以下内容:

代码语言:javascript
复制
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

确保您的文件是由用户执行的:

代码语言:javascript
复制
sudo chmod +x /path_to/script.sh

在创建两个文件之后,用以下方式重新加载systemd管理器配置:

代码语言:javascript
复制
sudo systemctl daemon-reload

现在,您可以对脚本使用start/stop/enable:

代码语言:javascript
复制
sudo systemctl enable checkfile
sudo systemctl start checkfile

确保在执行之前替换文件/目录/用户/组值。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18901622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档