我想编写一个Unix shell脚本,如果另一个字符串中有一个字符串,它将执行各种逻辑.例如,如果我在某个文件夹中,请分支.有人可以告诉我如何做到这一点?如果可能的话,我想让这不是特定于shell的(即不仅仅是bash),但如果没有别的方法可以做到这一点.
#!/usr/bin/env sh
if [ "$PWD" contains "String1" ]
then
echo "String1 present"
elif [ "$PWD" contains "String2" ]
then
echo "String2 present"
else
echo "Else"
fi
Run Code Online (Sandbox Code Playgroud) 我有一个Unix shell脚本会杀死正在访问文件夹的任何进程:
fuser -k ..\logs\*
Run Code Online (Sandbox Code Playgroud)
是否有与此等效的Windows批处理脚本?我知道TASKKILL,但我不确定它是否能满足我的需求.有谁知道Windows shell是否可以实现这一点?
我有一个运行 Red Hat 6.8 的 Docker 容器,并且有几个正在运行的 Java 进程。在具有相同操作系统的其他计算机上,我使用了类似于以下的命令来查找并终止所有 Java 进程:
ps -ef | grep 'java' | grep -v 'grep' | awk '{print $2}' | xargs kill -9
Run Code Online (Sandbox Code Playgroud)
但是,在这台机器上,它给了我以下错误:
xargs: kill: No such file or directory
Run Code Online (Sandbox Code Playgroud)
取消“| xargs Kill -9”确实有效,并向我显示了我想要杀死的进程的 PID,但由于某种原因,该命令无法同时工作。
有人知道为什么吗?
我有以下代码成功地让我在两天之间(以天,小时,分钟,秒为单位)的差异:
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-DD HH:mm:ss");
Date d1 = format.parse(startTime);
Date d2 = format.parse(endTime);
long diff = d2.getTime() - d1.getTime();
long diffSeconds = diff / 1000 % 60;
long diffMinutes = diff / (60 * 1000) % 60;
long diffHours = diff / (60 * 60 * 1000) % 24;
long diffDays = diff / (24 * 60 * 60 * 1000);
System.out.println("Start: " + startTime);
System.out.println("End: " + endTime);
System.out.println(diffDays + " days, " + diffHours + " …
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个Java程序,它可以浏览Weblogic JMS服务器中的所有JMS队列,并读取给定队列中的消息(但不消耗它们).我正在尝试使用Weblogic Mbeans和JMX,但对两者都是新手.我有以下代码来获取所有队列及其深度:
private void countMessages1() throws Exception {
JMXConnector connector = getMBeanServerConnector("/jndi/"+RuntimeServiceMBean.MBEANSERVER_JNDI_NAME);
MBeanServerConnection mbeanServerConnection = connector.getMBeanServerConnection();
ObjectName service = new ObjectName("com.bea:Name=RuntimeService,Type=weblogic.management.mbeanservers.runtime.RuntimeServiceMBean");
ObjectName serverRuntime = (ObjectName) mbeanServerConnection.getAttribute(service, "ServerRuntime");
ObjectName jmsRuntime = (ObjectName) mbeanServerConnection.getAttribute(serverRuntime, "JMSRuntime");
ObjectName[] jmsServers = (ObjectName[]) mbeanServerConnection.getAttribute(jmsRuntime, "JMSServers");
for (ObjectName jmsServer: jmsServers) {
if ("JMSServer".equals(jmsServer.getKeyProperty("Name"))) {
ObjectName[] destinations = (ObjectName[]) mbeanServerConnection.getAttribute(jmsServer, "Destinations");
for (ObjectName destination: destinations) {
String queueName = destination.getKeyProperty("Name");
Long queueDepth = (Long) mbeanServerConnection.getAttribute(destination, "MessagesCurrentCount");
System.out.println("Queue: " + queueName + " Depth: " + queueDepth);
} …
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个Java类来使用多个线程从JMS队列发送和读取消息以加快速度.我有以下代码.
System.out.println("Sending messages");
long startTime = System.nanoTime();
Thread threads[] = new Thread[NumberOfThreads];
for (int i = 0; i < threads.length; i ++) {
threads[i] = new Thread() {
public void run() {
try {
for (int i = 0; i < NumberOfMessagesPerThread; i ++) {
sendMessage("Hello");
}
} catch (Exception e) {
e.printStackTrace();
}
}
};
threads[i].start();
}
//Block until all threads are done so we can get total time
for (Thread thread : threads) {
thread.join();
}
long endTime …
Run Code Online (Sandbox Code Playgroud) 我想在多台机器上运行相同的Unix命令集.我知道ssh和下面的东西.我想编写一个shell脚本来执行此操作.我可以访问bash和ksh,我在Linux Red Hat 5上.
ssh root@ip "echo \$HOME"
Run Code Online (Sandbox Code Playgroud)
但是,我有两个问题:
我有一个表格,如下所示:
OrderNo, OrderType
1, Type1
2, Type1
3, Type2
4, Type3
5, Type4
Run Code Online (Sandbox Code Playgroud)
在OrderType上执行"分组依据"很简单,但有没有办法做"分组依据"来得到类似的东西:
OrderCount, OrderType
2, Type1
3, Not Type1
Run Code Online (Sandbox Code Playgroud)
这是DB2,但理想情况下,我正在寻找一种无论数据库供应商如何都能运行的解决方案.
我正在编写一个简单的Java Swing实用程序,它将从MQ JMS服务器读取消息并将它们显示在JTable中.
private void getMessages() {
try {
if (null != Queue) {
Queue.close(); //Close previous queue connection if there is one.
}
Queue = new MQQueue(QueueManager, tableQueues.getValueAt(tableQueues.getSelectedRow(), 1).toString(), MQConstants.MQOO_INPUT_SHARED | MQConstants.MQOO_BROWSE | MQConstants.MQOO_OUTPUT, queueManager, null, null);
int count = 0;
modelMessages.setRowCount(0);
MQGetMessageOptions getOptions = new MQGetMessageOptions();
getOptions.options = MQConstants.MQGMO_BROWSE_FIRST;
ArrayList<Object[]> rows = new ArrayList<Object[]>();
while(true) {
if (count > 0) {
getOptions.options = MQConstants.MQGMO_BROWSE_NEXT;
}
MQMessage message = new MQMessage();
try {
Queue.get(message, getOptions);
byte[] b = new …
Run Code Online (Sandbox Code Playgroud) 我熟悉Java JDBC并经常使用它来运行简单的SQL.但是,我想运行类似下面的内容.这比普通的SQL更多PL/SQL,因此我的问题.我不是从Oracle机箱运行它,而是从我自己的计算机运行它.有人可以帮助我使用Java运行这种PL/SQL吗?
spool C:\count.txt;
DEFINE date="TO_DATE ('08-29-2011','mm-dd-yyyy')";
SET NEWPAGE 0;
SET SPACE 0;
SET LINESIZE 500;
SET PAGESIZE 0;
SET ECHO OFF;
SET FEEDBACK OFF;
SET VERIFY OFF;
SET HEADING OFF;
SET TRIMSPOOL ON;
alter session set nls_date_format='yyyy-mm-dd hh24:mi';
select 'TABLE1', count(*) from SCHEMA.TABLE1 where modifyts < &date;
select 'TABLE2', count(*) from SCHEMA.TABLE2 where modifyts < &date;
select 'TABLE3', count(*) from SCHEMA.TABLE3 where modifyts < &date;
spool off;
Run Code Online (Sandbox Code Playgroud) 我有一个Java属性文件定义为:
Property.1=value1
Property.2=value2
...
Run Code Online (Sandbox Code Playgroud)
这里可以有任意数量的房产.
我熟悉如何阅读和使用Java属性,但是当我不知道它们的数量时,我不确定如何编写读取属性的代码.我对伪代码的想法是这样的:
// Somehow get the number of properties
for (int i=0; i<properties.size(); i++ {
prop.getProperty("Property"+i);
...
}
Run Code Online (Sandbox Code Playgroud)
有谁知道如何阅读可变数量的属性?
我有一个 Unix shell 脚本,如下所示:
(
# Trap the HUP signal so it doesn't kill me
trap "" HUP
# Redirect stderr to /dev/null
exec 2>/dev/null
# Redirect stdin from /dev/null
exec 0</dev/null
# Redirect stdout to logfile
exec 1>${LOG}
while [ 1 ]
do
ps -ewwo pcpu,pid,ppid,comm,time,etime,thcount,scount,fuser,args | grep -v "migration" | grep -v "watchdog" | grep -v "ksoftirqd"
sleep 600
done
) &
Run Code Online (Sandbox Code Playgroud)
我希望它在我运行的一些测试期间在后台运行以捕获进程信息。它运行带有一些选项的“ps”,然后休眠 10 分钟,我希望它无限期地运行(因为我的测试长度不同)。
我的问题是我没有办法阻止这个 - 执行“ps -ef”只显示“sleep 600”命令,而且我没有办法打破循环。有没有办法杀死这个脚本,或者更好地编写它,以便不包含永无止境的循环?我唯一的想法是编写脚本以在一定时间限制(即几组 10 分钟)后结束执行,但我不希望在每次测试之前都编辑脚本。
我有一个Java应用程序,当出错时,为每个错误写一个类似于下面的错误堆栈.
<Errors>
<Error ErrorCode="Code" ErrorDescription="Description" ErrorInfo="" ErrorId="ID">
<Attribute Name="ErrorCode" Value="Code"/>
<Attribute Name="ErrorDescription" Value="Description"/>
<Attribute Name="Key" Value="Key"/>
<Attribute Name="Number" Value="Number"/>
<Attribute Name="ErrorId" Value="ID"/>
<Attribute Name="UserId" Value="User"/>
<Attribute Name="ProgId" Value="Prog"/>
<Stack>typical Java stack</Stack>
</Error>
<Error>
Similar info to the above
</Error>
</Errors>
Run Code Online (Sandbox Code Playgroud)
我编写了一个Java日志解析器来浏览日志文件并收集有关此类错误的信息,虽然它确实有效,但它速度慢且效率低,特别是对于数百兆字节的日志文件.我只是基本上使用字符串操作来检测开始/结束标记的位置并计算它们.
有没有办法(通过Unix grep,Python或Java)有效地提取错误并计算每个错误发生的次数?整个日志文件不是XML,因此我无法使用XML解析器或Xpath.我面临的另一个问题是,有时错误的结束可能会滚动到另一个文件中,因此当前文件可能没有上面的整个堆栈.
编辑1:
这是我目前所拥有的(相关部分仅用于节省空间).
//Parse files
for (File f : allFiles) {
System.out.println("Parsing: " + f.getAbsolutePath());
BufferedReader br = new BufferedReader(new FileReader(f));
String line = "";
String fullErrorStack = "";
while ((line = br.readLine()) != null) {
if (line.contains("<Errors>")) …
Run Code Online (Sandbox Code Playgroud)