我有一个像这样的脚本:
#!/bin/bash
exec /usr/bin/some_binary > /tmp/my.log 2>&1
Run Code Online (Sandbox Code Playgroud)
问题是它将some_binary所有日志记录发送到stdout,并且缓冲使得它只能看到几行的块输出.当一些事情陷入困境时,这很烦人,我需要看看最后一行说的是什么.
有没有办法让stdout在我执行会影响some_binary的exec之前没有缓冲,所以它有更多有用的日志记录?
(包装器脚本只在exec之前设置一些环境变量,因此perl或python中的解决方案也是可行的.)
我想使用bash EXIT陷阱并使用exec以避免产生新进程.这可能吗?
那是,
#!/bin/bash
touch $0.$$
trap "rm -v $0.$$" EXIT
/bin/echo Hello
Run Code Online (Sandbox Code Playgroud)
$0.$$使用bash的EXIT陷阱删除临时文件
#!/bin/bash
touch $0.$$
trap "rm -v $0.$$" EXIT
exec /bin/echo Hello
Run Code Online (Sandbox Code Playgroud)
永远不会"触发"陷阱(完成后没有来自rm文件的消息$0.$$).
当然,它是有道理的,陷阱不会发射,因为bash不再受到控制exec.有没有办法让它工作和使用exec?诚然,这不仅仅是出于好奇而不是实际问题.
我正在尝试使用三列的阈值来过滤pandas数据帧
import pandas as pd
df = pd.DataFrame({"A" : [6, 2, 10, -5, 3],
"B" : [2, 5, 3, 2, 6],
"C" : [-5, 2, 1, 8, 2]})
df = df.loc[(df.A > 0) & (df.B > 2) & (df.C > -1)].reset_index(drop = True)
df
A B C
0 2 5 2
1 10 3 1
2 3 6 2
Run Code Online (Sandbox Code Playgroud)
但是,我想在一个函数中执行此操作,其中列的名称及其阈值在字典中提供给我.这是我的第一次尝试,运作正常.基本上我将过滤器放在cond变量中并运行它:
df = pd.DataFrame({"A" : [6, 2, 10, -5, 3],
"B" : [2, 5, 3, 2, 6],
"C" : …Run Code Online (Sandbox Code Playgroud) Ant exec任务有一个输出属性,可用于告诉Ant输出的位置.我用它将输出重定向到文件.问题是,如果我不对输出做些什么,那么Ant打印的东西并没有那么大的帮助 - 它并不完整.
有没有设置输出属性System.out?
如果我输入一个shell,我有vlc(重现视频的程序):
/ home/vlc"/ home/my movies /我想看的电影.mkv"
它打开了一个再现电影.
但是,当我运行以下程序时:
#include <unistd.h>
int main(void) {
execl("/home/vlc", "/home/my movies/the movie i want to see.mkv",NULL);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
vlc打开但不会重现任何内容.我怎么解决这个问题?
我试过的事情:
我猜的
execl("/home/vlc", "/home/my movies/the movie i want to see.mkv",NULL);
Run Code Online (Sandbox Code Playgroud)
相当于在shell中输入:
/home/vlc /home/my movies/the movie i want to see.mkv
Run Code Online (Sandbox Code Playgroud)
这不起作用,所以我试过
execl("/home/vlc", "\"/home/my movies/the movie i want to see.mkv\"",NULL);
Run Code Online (Sandbox Code Playgroud)
和vlc打开但不会重现.
我没有在最后写NULL,而是尝试了0,(char*)0,1 ....没有用.救命!!!!
我的过程分叉了几次,每次孩子都会执行 - 意味着我希望它能运行其他程序.
在主进程中,我使用open()syscall 打开文件描述符.
给它一个标志是否正确,O_CLOEXEC以便我运行的新程序exec()不具有fd资源?
我查看了与此类似的其他问题,但仍无法解决这个问题.
我有一个基本的PHP文件,它执行此操作:
?php
$item='example';
$tmp = exec("python testscriptphp.py .$item");
echo $tmp;
?
Run Code Online (Sandbox Code Playgroud)
虽然成功调用了我在webhostserver上运行的python.现在在我的python脚本中我想要这样的东西:
item=$item
print item
Run Code Online (Sandbox Code Playgroud)
基本上我问如何将变量从PHP传递到python脚本,然后在必要时返回php.
谢谢!
我是否用这个:
process = Runtime.getRuntime().exec("logcat -d time");
Run Code Online (Sandbox Code Playgroud)
或者那个:
process = new ProcessBuilder()
.command("logcat", "-d", "time")
.redirectErrorStream(true)
.start();
Run Code Online (Sandbox Code Playgroud)
我得到了相同的结果:它经常挂在exec()或start()调用中,无论我试图做什么!运行它的线程甚至不能被Thread.interrupt()中断!子进程肯定已启动,如果被杀死,则返回上述命令.
这些调用可能在第一次尝试时失败,所以没有办法阅读他们的输出!我也可以用一个简单的"su -c kill xxx"命令行,结果相同!
编辑:开始使用一些调试日志调试NDK项目中的java_lang_ProcessManager.cpp文件!所以这是我到目前为止找到的,在fork()之后父进程执行此操作:
int result;
int count = read(statusIn, &result, sizeof(int)); <- hangs there
close(statusIn);
Run Code Online (Sandbox Code Playgroud)
虽然子进程不应该阻止它:这就是孩子所做的事情(如果开始的话!):
// Make statusOut automatically close if execvp() succeeds.
fcntl(statusOut, F_SETFD, FD_CLOEXEC); <- make the parent will not block
// Close remaining unwanted open fds.
closeNonStandardFds(statusOut, androidSystemPropertiesFd); <- hangs here sometimes
...
execvp(commands[0], commands);
// If we got here, execvp() failed or the working …Run Code Online (Sandbox Code Playgroud) 我已经搜索了很多,以找到确切的答案,但没有找到任何答案.
很多人提到,我们应该& AT命令的结束并不等待回应.
例如,在后台运行bg.php,建议:
exec("/usr/bin/php bg.php &");
Run Code Online (Sandbox Code Playgroud)
但它对我不起作用.并且主脚本等待bg.php的完全执行.
我也读过某处在日志文件中写入bg.php输出,但我的后台脚本不会产生任何输出.它做了一些过程然后在数据库中写了一些东西.
我只是希望我的脚本运行bg.php而不要等它结束.
请帮我包括正确的代码.