Папка монитора для новых файлов с помощью Unix ksh сценарий оболочки или сценарий жемчуга и триггерный сценарий жемчуга

Согласно Timer документация, в Java 1.5 вперед, необходимо предпочесть ScheduledThreadPoolExecutor вместо этого. (Вы хотели бы создавать этого исполнителя, использующего Executors .newSingleThreadScheduledExecutor() для простоты использования; это создает что-то во многом как Timer.)

прохладная вещь при планировании задачи (путем вызова schedule()), она возвращается ScheduledFuture объект. Можно использовать это для отмены запланированной задачи. Вы тогда свободны отправить новую задачу с различным временем инициирования.

ЭТА: Timer в документации, связанной ни со что не говорится [приблизительно 118], однако , версия OpenJDK сказала следующее:

Java 5.0 представил java.util.concurrent, пакет и одна из утилит параллелизма там ScheduledThreadPoolExecutor, который является пулом потоков для того, чтобы неоднократно выполнить задачи на данном уровне или задержке. Это - эффективно более универсальная замена для Timer / TimerTask комбинация, поскольку это позволяет несколько сервисных потоков, принимает различные единицы измерения времени и не требует разделения на подклассы TimerTask (просто реализация Runnable). Конфигурирование ScheduledThreadPoolExecutor с одним потоком делает его эквивалентным [1 116].

9
задан 9 revs 8 October 2009 в 15:11
поделиться

6 ответов

Проверьте incron . Кажется, он делает именно то, что вам нужно.

9
ответ дан 4 December 2019 в 08:01
поделиться

Если я правильно понимаю, вам просто нужно что-то вроде этого?

#!/usr/bin/perl

use strict;
use warnings;

use File::Copy

my $poll_cycle = 5;
my $dest_dir = "/pri/vate";

while (1) {
    sleep $poll_cycle;

    my $dirname = '/exam/ple';

    opendir my $dh, $dirname 
        or die "Can't open directory '$dirname' for reading: $!";

    my @files = readdir $dh;
    closedir $dh;

    if ( grep( !/^[.][.]?$/, @files ) > 0 ) {
        print "Dir is not empty\n";

        foreach my $target (@files) {
            # Move file
            move("$dirname/$target", "$dest_dir/$target");

            # Trigger external Perl script
            system('./my_script.pl');
    }
}
6
ответ дан 4 December 2019 в 08:01
поделиться
#!/bin/ksh
while true
do
    for file in `ls /exam/ple/*.txt`
    do
          # mv -f /exam/ple/*.txt /pri/vate
          # changed to
          mv -f  $file  /pri/vate

    done
    sleep 30
done
0
ответ дан 4 December 2019 в 08:01
поделиться

Это приведет к изрядному количеству вызовов io - stat () и т.п. Если вам нужно быстрое уведомление без накладных расходов во время выполнения (но с большими предварительными усилиями), взгляните на FAM / dnotify: текст ссылки или текст ссылки

1
ответ дан 4 December 2019 в 08:01
поделиться

File :: ChangeNotify позволяет отслеживать файлы и каталоги на предмет изменений.

https://metacpan.org/pod/File::ChangeNotify

5
ответ дан 4 December 2019 в 08:01
поделиться
$ python autocmd.py /exam/ple .txt,.html /pri/vate some_script.pl

Преимущества:

  • проще установить, чем incron , поскольку pyinotify является чистым Python
  • управляемым событиями - меньше воздействия, чем скрипт Perl

autocmd.py :

#!/usr/bin/env python
"""autocmd.py 

Adopted from autocompile.py [1] example.

[1] http://git.dbzteam.org/pyinotify/tree/examples/autocompile.py

Dependencies:

Linux, Python, pyinotify
"""
import os, shutil, subprocess, sys

import pyinotify
from pyinotify import log

class Handler(pyinotify.ProcessEvent):
    def my_init(self, **kwargs):
        self.__dict__.update(kwargs)

    def process_IN_CLOSE_WRITE(self, event):
        # file was closed, ready to move it
        if event.dir or os.path.splitext(event.name)[1] not in self.extensions:
           # directory or file with uninteresting extension
           return # do nothing

        try:
            log.debug('==> moving %s' % event.name)
            shutil.move(event.pathname, os.path.join(self.destdir, event.name))
            cmd = self.cmd + [event.name]
            log.debug("==> calling %s in %s" % (cmd, self.destdir))
            subprocess.call(cmd, cwd=self.destdir)
        except (IOError, OSError, shutil.Error), e:
            log.error(e)

    def process_default(self, event):
        pass


def mainloop(path, handler):
    wm = pyinotify.WatchManager()
    notifier = pyinotify.Notifier(wm, default_proc_fun=handler)
    wm.add_watch(path, pyinotify.ALL_EVENTS, rec=True, auto_add=True)
    log.debug('==> Start monitoring %s (type c^c to exit)' % path)
    notifier.loop()


if __name__ == '__main__':
    if len(sys.argv) < 5:
       print >> sys.stderr, "USAGE: %s dir ext[,ext].. destdir cmd [args].." % (
           os.path.basename(sys.argv[0]),)
       sys.exit(2)

    path = sys.argv[1] # dir to monitor
    extensions = set(sys.argv[2].split(','))
    destdir = sys.argv[3]
    cmd = sys.argv[4:]

    log.setLevel(10) # verbose

    # Blocks monitoring
    mainloop(path, Handler(path=path, destdir=destdir, cmd=cmd,
                           extensions=extensions))
2
ответ дан 4 December 2019 в 08:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: