linux - 使用调度程序启动的 Kettle 作业没有文件夹许可 (Linux)

标签 linux permissions pentaho chmod kettle

我有一个 Kettle 作业的问题,这也是一个关于 linux 的问题。 我有一个创建几个文件夹的工作,删除其他文件夹并创建一些文件并将它们放在这些文件夹中。我不会详细描述这份工作的具体内容,因为这不是重点。在开始描述我的问题之前,我想说这项工作完美无缺,我的意思是,如果我从勺子或我的 ubuntu (14.04) 终端启动这项工作,显然有厨房,一切正常。问题是我开始使用调度程序(我认识的人用 java 编写的软件)定期启动许多作业。奇怪的是,当这个调度程序启 Action 业并尝试创建文件夹和文件时,它没有这样做的许可。开发人员向我保证,调度程序使用我编写的主文件夹的相同用户和组启 Action 业。我的意思是,如果我从终端启动命令 ls -al,它会将 ubuntu ubuntu 显示为文件夹的用户/组,这些与调度程序使用的相同。但不幸的是我不能告诉你更多关于它的信息,而且我真的没有机会管理调度程序代码并修改它,所以我不得不以另一种方式解决问题。

我尝试的第一件事是更改我使用作业创建子文件夹和文件的文件夹中的许可。我使用命令 sudo chmod 777 -R/media/Folder 授予文件夹和子文件夹的所有许可(如您所见,我主要在/media 文件夹中工作)。现在转换可以写入第一个子文件夹,比方说 /media/Folder/First_Folder,但它仍然没有新文件夹的许可,我的意思是它无法创建文件夹 /media/Folder/First_Folder/Second_Folder 因为这个新文件夹 (Second_Folder) 没有继承父文件夹的许可(因为它的创建晚于 chmod 命令)。所以我正在寻找一种方法来为我工作的父文件夹中新创建的文件夹和文件提供正确的许可。许多人建议使用命令umask,但这必须在创建文件夹的过程中完成,而我不能这样做。任何人都知道另一种方法来解决这个问题,作用于文件夹许可?

我想到的第二个解决方案是更改 Pentaho Kettle 作业条目的源代码。我想也许我可以添加一些代码行来更改我想创建新文件夹的文件夹的许可。例如,我找到了创建文件夹作业条目的代码,也许我应该在那里添加一些东西。但在我这样做之前,我想知道是否有人已经做过类似的事情(或类似的事情)。 这是代码:

package org.pentaho.di.job.entries.createfolder;

import static org.pentaho.di.job.entry.validator.AbstractFileValidator.putVariableSpace;
import static org.pentaho.di.job.entry.validator.AndValidator.putValidators;
import static org.pentaho.di.job.entry.validator.JobEntryValidatorUtils.andValidator;
import static org.pentaho.di.job.entry.validator.JobEntryValidatorUtils.fileDoesNotExistValidator;
import static org.pentaho.di.job.entry.validator.JobEntryValidatorUtils.notNullValidator;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.vfs.FileObject;
import org.apache.commons.vfs.FileType;
import org.pentaho.di.cluster.SlaveServer;
import org.pentaho.di.core.CheckResultInterface;
import org.pentaho.di.core.Result;
import org.pentaho.di.core.database.DatabaseMeta;
import org.pentaho.di.core.exception.KettleDatabaseException;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.exception.KettleXMLException;
import org.pentaho.di.core.variables.VariableSpace;
import org.pentaho.di.core.variables.Variables;
import org.pentaho.di.core.vfs.KettleVFS;
import org.pentaho.di.core.xml.XMLHandler;
import org.pentaho.di.job.JobMeta;
import org.pentaho.di.job.entries.createfile.JobEntryCreateFile;
import org.pentaho.di.job.entry.JobEntryBase;
import org.pentaho.di.job.entry.JobEntryInterface;
import org.pentaho.di.job.entry.validator.ValidatorContext;
import org.pentaho.di.repository.ObjectId;
import org.pentaho.di.repository.Repository;
import org.pentaho.metastore.api.IMetaStore;
import org.w3c.dom.Node;

/**
* This defines a 'create folder' job entry. Its main use would be to create empty folder that can be used to control
* the flow in ETL cycles.
*
* @author Sven/Samatar
* @since 18-10-2007
*
*/
public class JobEntryCreateFolder extends JobEntryBase implements Cloneable, JobEntryInterface {
  private String foldername;
  private boolean failOfFolderExists;

  public JobEntryCreateFolder( String n ) {
    super( n, "" );
    foldername = null;
    failOfFolderExists = true;
  }

  public JobEntryCreateFolder() {
    this( "" );
  }

  public Object clone() {
    JobEntryCreateFolder je = (JobEntryCreateFolder) super.clone();
    return je;
  }

  public String getXML() {
    StringBuffer retval = new StringBuffer( 50 );

    retval.append( super.getXML() );
    retval.append( " " ).append( XMLHandler.addTagValue( "foldername", foldername ) );
    retval.append( " " ).append( XMLHandler.addTagValue( "fail_of_folder_exists", failOfFolderExists ) );

    return retval.toString();
  }

  public void loadXML( Node entrynode, List<DatabaseMeta> databases, List<SlaveServer> slaveServers,
    Repository rep, IMetaStore metaStore ) throws KettleXMLException {
    try {
      super.loadXML( entrynode, databases, slaveServers );
      foldername = XMLHandler.getTagValue( entrynode, "foldername" );
      failOfFolderExists = "Y".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "fail_of_folder_exists" ) );
    } catch ( KettleXMLException xe ) {
      throw new KettleXMLException( "Unable to load job entry of type 'create folder' from XML node", xe );
    }
  }

  public void loadRep( Repository rep, IMetaStore metaStore, ObjectId id_jobentry, List<DatabaseMeta> databases,
    List<SlaveServer> slaveServers ) throws KettleException {
    try {
      foldername = rep.getJobEntryAttributeString( id_jobentry, "foldername" );
      failOfFolderExists = rep.getJobEntryAttributeBoolean( id_jobentry, "fail_of_folder_exists" );
    } catch ( KettleException dbe ) {
      throw new KettleException(
        "Unable to load job entry of type 'create Folder' from the repository for id_jobentry=" + id_jobentry,
        dbe );
    }
  }

  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_job ) throws KettleException {
    try {
      rep.saveJobEntryAttribute( id_job, getObjectId(), "foldername", foldername );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "fail_of_folder_exists", failOfFolderExists );
    } catch ( KettleDatabaseException dbe ) {
      throw new KettleException( "Unable to save job entry of type 'create Folder' to the repository for id_job="
        + id_job, dbe );
    }
  }

  public void setFoldername( String foldername ) {
    this.foldername = foldername;
  }

  public String getFoldername() {
    return foldername;
  }

  public String getRealFoldername() {
    return environmentSubstitute( getFoldername() );
  }

  public Result execute( Result previousResult, int nr ) {
    Result result = previousResult;
    result.setResult( false );

    if ( foldername != null ) {
      String realFoldername = getRealFoldername();
      FileObject folderObject = null;
      try {
        folderObject = KettleVFS.getFileObject( realFoldername, this );

        if ( folderObject.exists() ) {
          boolean isFolder = false;

          // Check if it's a folder
          if ( folderObject.getType() == FileType.FOLDER ) {
            isFolder = true;
          }

          if ( isFailOfFolderExists() ) {
            // Folder exists and fail flag is on.
            result.setResult( false );
            if ( isFolder ) {
              logError( "Folder [" + realFoldername + "] exists, failing." );
            } else {
              logError( "File [" + realFoldername + "] exists, failing." );
            }
          } else {
            // Folder already exists, no reason to try to create it
            result.setResult( true );
            if ( log.isDetailed() ) {
              logDetailed( "Folder [" + realFoldername + "] already exists, not recreating." );
            }
          }

        } else {
          // No Folder yet, create an empty Folder.
          folderObject.createFolder();
          if ( log.isDetailed() ) {
            logDetailed( "Folder [" + realFoldername + "] created!" );
          }
          result.setResult( true );
        }
      } catch ( Exception e ) {
        logError( "Could not create Folder [" + realFoldername + "]", e );
        result.setResult( false );
        result.setNrErrors( 1 );
      } finally {
        if ( folderObject != null ) {
          try {
            folderObject.close();
            folderObject = null;
          } catch ( IOException ex ) { /* Ignore */
          }
        }
      }
    } else {
      logError( "No Foldername is defined." );
    }

    return result;
  }

  public boolean evaluates() {
    return true;
  }

  public boolean isFailOfFolderExists() {
    return failOfFolderExists;
  }

  public void setFailOfFolderExists( boolean failIfFolderExists ) {
    this.failOfFolderExists = failIfFolderExists;
  }

  public static void main( String[] args ) {
    List<CheckResultInterface> remarks = new ArrayList<CheckResultInterface>();
    new JobEntryCreateFile().check( remarks, null, new Variables(), null, null );
    System.out.printf( "Remarks: %s\n", remarks );
  }

  public void check( List<CheckResultInterface> remarks, JobMeta jobMeta, VariableSpace space,
    Repository repository, IMetaStore metaStore ) {
    ValidatorContext ctx = new ValidatorContext();
    putVariableSpace( ctx, getVariables() );
    putValidators( ctx, notNullValidator(), fileDoesNotExistValidator() );
    andValidator().validate( this, "filename", remarks, ctx );
  }
}

可能第一个解决方案是最好的并且侵入性较小。但直到现在我还没有成功。有什么想法吗?

最佳答案

您是否尝试从 carte 服务器实例启动此预定作业?

远程设置预定作业或转换的正确方法是向作业添加一个启动步骤(第一步),单击并设置调度,之后,从控制台启动 carte.sh 服务器,设置从属服务器从你在 kettle 中的工作并远程启动,现在 carte 服务器将保留这个工作和时间表。

关于linux - 使用调度程序启动的 Kettle 作业没有文件夹许可 (Linux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25010552/

相关文章:

linux - Linux 上最适合用户私有(private)文件夹的文件夹分布是什么?

linux - 如何使用 sed 替换包含斜杠的字符串?

ruby-on-rails - log/production.log 文件存在但为空

javascript - Google Analytics API JavaScript 在仪表板上无需登录用户即可显示数据

java - 无法在 Pentaho 数据集成(Kettle)中运行 spoon.bat 或任何其他批处理文件

linux - 重命名可执行文件失败

linux - 在 Fedora 23 上安装特定版本的 pupppet

SSH key : “Permissions 0644 for ' id_rsa. pub' 太开放了。”在苹果机上

android - 如何以编程方式检查 Android "Location Consent"?

reactjs - tomcat apache 8 服务器上的 Pentaho API(端口 - 8080)在通过不同的 Web 应用程序(react JS,端口 - 3000)调用时会出现 COR 问题