想将ubuntu下某个文件夹下的文件定时上传至FTP或者共享文件夹,也可以直接传至另一台LINUX上使用。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了想将ubuntu下某个文件夹下的文件定时上传至FTP或者共享文件夹,也可以直接传至另一台LINUX上使用。相关的知识,希望对你有一定的参考价值。

我有2台linux,一台不定时生成文件,大概1天后要在另一台linux上使用,所以要定时的将文件上传至中间服务器或者直接上传至另一台linux,但是文件时一个一个生成,上传完毕要备份,不然越积越多。请教高手,解决问题再加200分,在线等

写的一个简单脚本.
linux1 = A (不定时生成文件)
linux2 = B (需隔一天后使用文件)
B 主机必须提供FTP服务,建立相应的FTP用户,具备相应的上传权限和容量等.
/home/backup :文件备份临时目录
/home/bak :本地文件备份目录
注意:如果服务器语言为英文,请将脚本内中文注释改为英文或删除.

A 主机
-----------------------------------------------------------------------
mkdir /home/backup
mkdir /home/bak
vi /home/backup.sh
vi /etc/crontab
30 2 * * * root /home/backup.sh
#建立目录,设置每天2:30定时执行备份脚本

backup.sh内容

#!/bin/bash
#
# 说明:
# 自动备份本机文件到远程FTP
#
PATH=/bin:/usr/bin:/sbin:/usr/sbin
LANG=C
LC_ALL=C
# 设置A路径
date='date +%Y-%m-%d'
bakdir=/home/backup
home=/home
# A主机 "/etc/目录下的文件"
cp -a /etc/* $bakdir
# 延迟20S,等文件拷贝结束
sleep 20s
sync;sync
# 在本机压缩与打包
cd $bakdir
tar -zcf "$date".tar.gz *
sleep 20s
sync;sync
# 备份到B主机
id="username"
pw="yourpassword"
cd= $bakdir
# 利用FTP备份到192.168.1.200
ftp -n 192.168.1.200 > $home/ftp.log 2>&1 <<EOC
user $id $pw
binary
cd $bakdir
put "$date".tar.gz
bye EOC
sync;sync
# 移动到本机备份
mv $bakdir/"$date".tar.gz $bakdir/bak
sleep 20s
sync;sync
参考技术A

    你可以在你的ubuntu系统下新建一个crontab任务

    首先使用 vi /etc/crontab  进入配置文件

    在文件中输入你要定的时间 ,顺序 是分 时 日 月 周

    然后紧接后面写上命令,即cp  你要操作的文件路径    共享文件夹 ,

    如果要传到另外一台linux,同样可以使用 scp 文件路径  root@linuxip:存放目录路径

    的方式达到目的

参考技术B 定时命令用crontab命令即可,上传的话lftp命令比较好用,可以自己查一下使用方法。总之crontab和lftp两个命令就可以完成。
crontab文件的一些例子:

#每晚的21:30重启apache。

30 21 * * * /usr/local/etc/rc.d/lighttpd restart

#每月1、10、22日

45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart

#每天早上6点10分

10 6 * * * date

#每两个小时

0 */2 * * * date

#晚上11点到早上8点之间每两个小时,早上8点

0 23-7/2,8 * * * date

#每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点

0 11 4 * mon-wed date

#1月份日早上4点

0 4 1 jan * date
参考技术C 加多分不重要 关键是这样的问题

你就不要想省事了 就每天自己上传吧 这样虽说麻烦点 但是可靠 别老相信计算机他也会骗人
自动上传的 有的不报错误 这个文件很重要 然而么上传上去 也没报错 你也不知道
这不就完了吗
还是建议你自己上传!!!
参考技术D sync应该可是解决你的问题,自己找一下文档看看怎么设置,也可以看看我给你的网址。

参考资料:http://www.zero89.org/html/2010/10/530.html

java利用WatchService实时监控某个目录下的文件变化并按行解析(注:附源代码)

首先说下需求:通过ftp上传约定格式的文件到服务器指定目录下,应用程序能实时监控该目录下文件变化,如果上传的文件格式符合要求,将将按照每一行读取解析再写入到数据库,解析完之后再将文件改名。

一. 一开始的思路

  设置一个定时任务,每隔一分钟读取下指定目录下的文件变化,如果有满足格式的文件,就进行解析。

     这种方式很繁琐,而且效率低,效率都消耗在了遍历、保存状态、对比状态上了! 而且无法利用OS的很多功能。

 

二. WatchService介绍

1、 该类的对象就是操作系统原生的文件系统监控器!我们都知道OS自己的文件系统监控器可以监控系统上所有文件的变化,这种监控是无需遍历、无需比较的,是一种基于信号收发的监控,因此效率一定是最高的;现在Java对其进行了包装,可以直接在Java程序    中使用OS的文件系统监控器了;

2、 获取当前OS平台下的文件系统监控器:

         i. WatchService watcher = FileSystems.getDefault().newWatchService();

         ii. 从FileSystems这个类名就可以看出这肯定是属于OS平台文件系统的,接下来可以看出这一连串方法直接可以得到一个文件监控器;

  这里暂时不用深入理解这串方法的具体含义,先知道怎么用就行了;

3、 我们都知道,操作系统上可以同时开启多个监控器,因此在Java程序中也不例外,上面的代码只是获得了一个监控器,你还可以用同样的代码同时获得多个监控器;

4、 监控器其实就是一个后台线程,在后台监控文件变化所发出的信号,这里通过上述代码获得的监控器还只是一个刚刚初始化的线程,连就绪状态都没有进入,只是初始化而已;

 

三、实现过程

  其实就是在初始化的时候创建一个线程,然后用watchService实时监控该目录下文件变化,如果有满足条件文件加进来,就按照约定的格式解析文件再写入数据库,详细步骤如下!

  1、web.xml监听器配置文件监控监听器  

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:root-context.xml</param-value>
    </context-param>

    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter>
        <filter-name>sitemesh</filter-name>
        <filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>sitemesh</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <servlet>
        <servlet-name>appServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:servlet-context.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>appServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
    <!-- 配置spring监听器 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!-- 配置监控文件变化监听器 -->
    <listener>
        <listener-class>com.zealer.ad.listener.ThreadStartUpListenser</listener-class>
    </listener>
    <listener>
        <listener-class>com.zealer.ad.listener.SessionLifecycleListener</listener-class>
    </listener>
    
    
    <jsp-config>
      <taglib>
       <taglib-uri>/tag</taglib-uri>
       <taglib-location>/WEB-INF/tag/tag.tld</taglib-location>
      </taglib>
    </jsp-config>

    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    
    <session-config>
        <session-timeout>45</session-timeout>
    </session-config>
</web-app>

  2、编写一个ThreadStartUpListenser类,实现ServletContextListener,tomcat启动时创建后台线程

  ThreadStartUpListenser.java

package com.zealer.ad.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Component;

import com.zealer.ad.task.WatchFilePathTask;

@Component
public class ThreadStartUpListenser implements ServletContextListener
{
    private static WatchFilePathTask r = new WatchFilePathTask();

    private Log log = LogFactory.getLog(ThreadStartUpListenser.class);
    
    /*
     * tomcat启动的时候创建一个线程
     * */
    @Override
    public void contextInitialized(ServletContextEvent paramServletContextEvent)
    {
        r.start();
        log.info("ImportUserFromFileTask is started!");
    }
    
    /*
     * tomcat关闭的时候销毁这个线程
     * */
    @Override
    public void contextDestroyed(ServletContextEvent paramServletContextEvent)
    {
        r.interrupt();
    }

}

  3、创建指定目录文件变化监控类

    WatchFilePathTask.java

package com.zealer.ad.task;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.joda.time.DateTime;

import com.zealer.ad.util.ConfigUtils;
import com.zealer.ad.util.SpringUtils;
/**
 * 指定目录文件变化监控类
 * @author cancer
 *
 */
public class WatchFilePathTask extends Thread
{
    private Log log = LogFactory.getLog(WatchFilePathTask.class);
    
    private static final String filePath = ConfigUtils.getInstance().getValue("userfile_path");
    
    private WatchService watchService;
    
    @Override
    public void run()
    {
        try
        {
            //获取监控服务
            watchService = FileSystems.getDefault().newWatchService();
            log.debug("获取监控服务"+watchService);
            Path path = FileSystems.getDefault().getPath(filePath);
            log.debug("@@@:Path:"+path);
            
            final String todayFormat = DateTime.now().toString("yyyyMMdd");
            
            File existFiles = new File(filePath);
            //启动时检查是否有未解析的符合要求的文件
            if(existFiles.isDirectory())
            {
                File[] matchFile = existFiles.listFiles(new FileFilter()
                {
                    
                    @Override
                    public boolean accept(File pathname)
                    {
                        if((todayFormat+".txt").equals(pathname.getName()))
                        {
                            return true;
                        }
                        else
                        {
                            return false;
                        }
                    }
                });
                
                if(null != matchFile)
                {
                    for (File file : matchFile)
                    {
                        //找到符合要求的文件,开始解析
                        ImportUserFromFileTask task = (ImportUserFromFileTask) SpringUtils.getApplicationContext().getBean("importUserFromFileTask");
                        task.setFileName(file.getAbsolutePath());
                        task.start();
                    }
                }
            }
       
//注册监控服务,监控新增事件 WatchKey key = path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);        while (true) { key = watchService.take(); for (WatchEvent<?> event : key.pollEvents()) { //获取目录下新增的文件名 String fileName = event.context().toString(); //检查文件名是否符合要求 if((todayFormat+".txt").equals(fileName)) { String filePath = path.toFile().getAbsolutePath()+File.separator+fileName; log.info("import filePath:"+filePath); //启动线程导入用户数据 ImportUserFromFileTask task = (ImportUserFromFileTask) SpringUtils.getApplicationContext().getBean("importUserFromFileTask");//new ImportUserFromFileTask(filePath); task.setFileName(filePath); task.start(); log.debug("启动线程导入用户数据"+task); } } key.reset(); } } catch (IOException e) { log.error(e.getMessage(),e); } catch (InterruptedException e) { log.error(e.getMessage(),e); } } }

  4、创建解析用户文件及导入数据库线程,由WatchFilePathTask启动

package com.zealer.ad.task;

import com.zealer.ad.entity.AutoPutUser;
import com.zealer.ad.entity.Bmsuser;
import com.zealer.ad.service.AutoPutUserService;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import org.joda.time.DateTime;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;

import java.util.Date;

import javax.annotation.Resource;


/**
 * 解析用户文件及入库线程,由WatchFilePathTask启动
 * @author cancer
 *
 */
public class ImportUserFromFileTask extends Thread {
    private Log log = LogFactory.getLog(ImportUserFromFileTask.class);
    private String fileName;
    @Resource(name = "autoPutUserService")
    private AutoPutUserService autoPutUserService;

    @Override
    public void run() {
        File file = new File(fileName);

        if (file.exists() && file.isFile()) {
            log.debug(":@@@准备开始休眠10秒钟:" + file);

            //休眠十分钟,防止文件过大还没完全拷贝到指定目录下,这里的线程就开始读取文件
            try {
                sleep(10000);
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }

            InputStreamReader read;

            try {
                read = new InputStreamReader(new FileInputStream(file), "UTF-8");

                BufferedReader bufferedReader = new BufferedReader(read);
                String lineTxt = null;
                int count = 0;
                Boolean f = false;

                while ((lineTxt = bufferedReader.readLine()) != null) {
                    if ((null == lineTxt) || "".equals(lineTxt)) {
                        continue;
                    }

                    if (lineTxt.startsWith("‘")) {
                        lineTxt = lineTxt.substring(1, lineTxt.length());
                    }

                    //解析分隔符为‘, ‘
                    String[] lines = lineTxt.split("‘, ‘");
                    int length = lines.length;

                    if (length < 2) {
                        continue;
                    }

                    Bmsuser bmsuser = new Bmsuser();
                    bmsuser.setName(lines[0]);if (!"".equals(lines[1])) {
                        bmsuser.setCity(lines[1]);
                    }
//根据唯一索引已经存在的数据则不插入
                    f = autoPutUserService.insertIgnore(bmsuser);

                    if (f) {
                        count++;
                    }
                }

                //汇总数据
                AutoPutUser autoPutUser = new AutoPutUser();
                autoPutUser.setTotalCount(autoPutUserService.getUserCount());
                autoPutUser.setCount(count);
                autoPutUser.setCountDate(new Date(System.currentTimeMillis()));

                String today = DateTime.now().toString("yyyy-MM-dd");
                Integer oldCount = autoPutUserService.getOldCount(today);

                //如果今天导入过了就更新否则插入
                if (!oldCount.equals(0)) {
                    autoPutUserService.updateUserData(autoPutUser, today,
                        oldCount);
                } else {
                    autoPutUserService.gatherUserData(autoPutUser);
                }

                //注意:要关闭流
                read.close();
            } catch (Exception e) {
                log.error(e.getMessage(), e);
            }

            File newFile = new File(file.getPath() +
                    System.currentTimeMillis() + ".complate");
            file.renameTo(newFile);
        } else {
            log.error(fileName + " file is not exists");
        }
    }

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public AutoPutUserService getAutoPutUserService() {
        return autoPutUserService;
    }

    public void setAutoPutUserService(AutoPutUserService autoPutUserService) {
        this.autoPutUserService = autoPutUserService;
    }
}

 

附带:

1、sql脚本

CREATE TABLE `bmsuser` (
  `id` int(255) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(32) DEFAULT NULL ,
  `city` varchar(32) DEFAULT NULL COMMENT ,
  PRIMARY KEY (`bmsid`),
  UNIQUE KEY `bbLoginName` (`bbLoginName`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

2、文件格式,命名为yyyyMMdd.txt

‘张三‘, ‘深圳‘

 

以上是关于想将ubuntu下某个文件夹下的文件定时上传至FTP或者共享文件夹,也可以直接传至另一台LINUX上使用。的主要内容,如果未能解决你的问题,请参考以下文章

java利用WatchService实时监控某个目录下的文件变化并按行解析(注:附源代码)

Ubuntu基本操作(博主想上传图片给服务器的一些命令)

Ubuntu cron 定时执行任务

定时清除ubuntu下log日志文件

本地上传文件至服务器的技巧(linux文件压缩及解压文件)

Ubuntu安装FTP 服务, 实现和Windows的文件互传