- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个 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/
我正在设计一款支持签到的应用。 使用应用程序时的 GPS 权限是必须。但是有一个使用地理围栏自动 checkin 的可选功能,它需要“始终”gps 权限。 我想首先请求常规的“使用时”权限。然后,仅当
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 已关闭 8 年前。 Improve
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 6年前关闭。 Improve this qu
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 7 年前。 Improve
最近,我研究了使用 OnGuard 来帮助诚实的人遵守他们的原则。我同意这里许多人表达的观点,即任何许可制度都无法保护您免受那些想要使用您的软件但不想付费的人的侵害。另一方面,我希望避免让其他人太容易
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
我试图在计算机上设置Windows Developer许可证,但失败。 我正在运行Visual Studio 2012。 当我单击“项目”->“商店”->“获取开发者许可证”时,它向我显示一个信息对话
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭11 年前。 Improve th
我想购买 Delphi Xe2 Pro。我独自一人使用它,我有 2 台电脑:一台在办公室,一台可移植用于“在路上”工作。Delphi Xe2 许可证不是很清楚,因此有什么办法可以为 2 台 PC 只购
我正在我的应用程序中安装 Android Licensing,我想知道什么是检查许可证的良好形式 - 每次或仅一次并保存它已被许可共享偏好的事实?我担心的是,如果用户处于离线状态,他们将被锁定在应用程
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
有人知道 WinRT 应用程序的许可是如何工作的吗? 我已向 Microsoft 申请了免费的开发人员许可证,这似乎与 temporarykey.pfx 或 appxmanifest 文件相关联。问题
我一直在网上搜索如何接受 Xcode,以便使用 Xcode 为 MAC 重新编译 MATLAB Windows 文件,但我没有找到任何相关的答案。 我在 MATLAB 中得到的错误消息是: Xcode
一些工作推到 QA,一些工作推到生产。 应该只允许开发人员推送到 QA,并且只允许 QA 推送到生产。除了制作两个单独的构建服务器(通过某种方式共享工件)之外,我如何限制权限? 最佳答案 您需要基于项
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭10 年前。 Improve th
在 MacOS Catalina 上升级到 Xcode 11.1 后,运行一些命令(例如 git status)会导致 Xcode 声明必须同意许可。显然,我们可以运行 git status 和 gr
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 9年前关闭。 Improve this que
在 MacOS Catalina 上升级到 Xcode 11.1 后,运行一些命令(例如 git status)会导致 Xcode 声明必须同意许可。显然,我们可以运行 git status 和 gr
我正在构建一个小型 winforms 应用程序:ayende rhino licensing .许可工作正常,我可以创建许可并按我的选择分发它们。 问题是,如何让每个许可证只在一台机器上工作?我知道在
我是一名优秀的程序员,十分优秀!