来源:https://github.com/Blaok/nextcloud-inotifyscan
有点小问题,简单修改了一下
① nextcloud-inotifyscan.service:
[Unit] Description=Nextcloud inotify scan [Service] Type=simple User=www-data ExecStart=/usr/bin/nextcloud-inotifyscan [Install] WantedBy=multi-user.target
② nextcloud-inotifyscan
#!/usr/bin/python
import fcntl
import os
import subprocess
import sys
import time
interval = os.environ.get('INTERVAL', 1.)
nextcloud_home = '/nextcloud_home'
user_name = 'nextcloud_user'
occ_path = '/var/www/nextcloud/occ'
data_prefix = nextcloud_home+''
data_prefix_len = len(data_prefix)
scan_paths = set()
inotifywait_proc = subprocess.Popen(['inotifywait', '--event', 'create,modify,move,delete', '--exclude', '/\.', '--recursive', data_prefix+'/'+user_name+'/files', '--quiet', '--format', '%e/%f%w/', '--monitor'], stdout=subprocess.PIPE, bufsize=0)
inotifywait_fd = inotifywait_proc.stdout.fileno()
inotifywait_fl = fcntl.fcntl(inotifywait_fd, fcntl.F_GETFL)
while True:
event = ''
file_name = ''
file_path = ''
while True:
fcntl.fcntl(inotifywait_fd, fcntl.F_SETFL, inotifywait_fl|os.O_NONBLOCK)
try:
c = inotifywait_proc.stdout.read(1)
except:
for p in scan_paths:
sys.stderr.write('Scan for %s\n' % p)
subprocess.call(['php', occ_path, 'files:scan', '--no-interaction', '--path='+p, '--shallow'])
scan_paths = set()
time.sleep(interval)
continue
fcntl.fcntl(inotifywait_fd, fcntl.F_SETFL, inotifywait_fl)
if c != '/':
event += c
else:
while True:
c = inotifywait_proc.stdout.read(1)
if c != '/':
file_name += c
else:
lastc = ''
while True:
lastlastc = lastc
lastc = c
c = inotifywait_proc.stdout.read(1)
if c == '\n' and lastc == '/' and lastlastc == '/':
break
else:
file_path += lastc
break
break
if set(event.split(',')) & {'CREATE', 'MODIFY'}:
scan_path = file_path+file_name
else:
scan_path = file_path
if data_prefix == scan_path[:data_prefix_len]:
scan_path = scan_path[data_prefix_len:]
sys.stderr.write('Found %s %s %s\n' % (file_path, event, file_name))
scan_paths |= {scan_path}