我有一个Perl脚本,它自己分叉和守护.它由cron运行,所以为了不留下僵尸,我关闭了STDIN,STDOUT和STDERR:
open STDIN, '/dev/null' or die "Can't read /dev/null: $!";
open STDOUT, '>>/dev/null' or die "Can't write to /dev/null: $!";
open STDERR, '>>/dev/null' or die "Can't write to /dev/null: $!";
if (!fork()) {
do_some_fork_stuff();
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:我想在此之后恢复至少STDOUT(恢复其他2会很好).但是我需要使用什么魔术符号来重新打开STDOUT,就像STDOUT一样?
我知道如果我是从tty运行的话我可以使用"/ dev/tty"(但我是从cron运行并依赖于其他地方的stdout).我也读过你可以把STDOUT放在一边的技巧open SAVEOUT,">&STDOUT",但只是制作这个副本的行为并没有解决留下僵尸的原始问题.
我正在寻找是否有一些神奇的东西open STDOUT,"|-"(我知道不是这样)以打开它应该打开的方式打开STDOUT.
所以我有一个功能,如:
public static function UnorderedList($items, $field, $view = false){
if(count($items) > 0){
echo '<ul>';
foreach($items as $item){
echo '<li>';
if($view){
echo '<a href="'.$view.'id='.$item->sys_id.'" title="View Item">'.$item->$field.'</a>';
}else{
echo $item->$field;
}
echo '</li>';
}
echo '</ul>';
}else{
echo '<p>No Items...</p>';
}
}
Run Code Online (Sandbox Code Playgroud)
此函数循环一些项目并呈现无序列表.我想知道的是,如果我愿意,它是否可以捕获回声输出.
我通过执行以下操作来打电话来使用此功能:
Render::UnorderedList(Class::getItems(), Class::getFields(), true);
Run Code Online (Sandbox Code Playgroud)
这会将无序列表转储到我的页面上.我知道我可以将echo更改为变量并返回变量,但我只是好奇是否有可能捕获echo输出而不修改该函数,只是以某种方式修改对函数的调用?
谢谢!
我想在我的bash脚本中测试stdout和stderr的定向,或者更确切地说,如果它们已被重定向.
你有个主意吗?
在$*bash的变量不给我这个信息.
我有这个代码:
#include <stdio.h>
#include <unistd.h>
int main()
{
while(1)
{
fprintf(stdout,"hello-out");
fprintf(stderr,"hello-err");
sleep(1);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出hello-err hello-err hello-err hello-err hello-err hello-err
间隔为1秒.我想知道为什么hello-out永远不会被打印出来.
我将我的c程序的stderr和stdout的输出重定向到两个文件,然后恢复原始的stdout和stderr:
int sout = dup(fileno(stdout));
freopen("test.txt","w",stdout);
int serr = dup(fileno(stderr));
freopen("test.txt","a",stderr);
//some output....
dup2(sout,fileno(stdout));
close(sout);
dup2(serr,fileno(stderr));
close(serr);
Run Code Online (Sandbox Code Playgroud)
这就是代码示例.这有效.
但是我想将stdout和stderr重定向到同一个文件(以后再恢复它),以便输出按照与不重定向stderr和stdout时在控制台输出上排序的顺序相同的顺序排序.我怎样才能做到这一点?
我有一个python脚本,看起来像这样:
for item in collection:
print "what up"
#do complicated stuff that takes a long time.
Run Code Online (Sandbox Code Playgroud)
在bash中,我通过执行以下操作来运行此脚本:
$ python my.py | tee my_file.txt
Run Code Online (Sandbox Code Playgroud)
但是,我在bash中看到的只是一个空行,直到程序结束.然后,所有的打印语句都在一个.
这是发球台的预期操作吗?我可以使用T恤实时查看输出吗?
我创造了:
var access = fs.createWriteStream('/var/log/node/api.access.log', { flags: 'w' });
Run Code Online (Sandbox Code Playgroud)
然后管道:
process.stdout.pipe(access);
Run Code Online (Sandbox Code Playgroud)
然后尝试:
console.log("test");
Run Code Online (Sandbox Code Playgroud)
并且/var/log/node/api.access.log中没有出现任何内容.但是这种方式有效:
process.stdout.pipe(access).write('test');
Run Code Online (Sandbox Code Playgroud)
有人可以解释我做错了什么吗?
这个问题的动机是Rmarkdown没有将系统命令的结果输出到html文件.由于某种原因,system()R(或system2())中的输出无法被sink()或捕获capture.output(),因此目前knitr无法记录输出.例如,在R控制台中:
> system('ls')
DESCRIPTION
NAMESPACE
R
README.md
inst
man
Run Code Online (Sandbox Code Playgroud)
但在knitr文档中,您将看不到输出,因为capture.output(system('ls'))是character(0),即输出无法捕获.当然,我可以cat(system('ls', intern = TRUE), sep = '\n')按照我在答案中提到的那样做,但这有点尴尬.我想知道它是否是一种system()不使用intern = TRUE和捕获输出的方法cat().
更新:请参阅https://github.com/yihui/knitr/issues/1203,了解我为解决问题而提供的黑客攻击.
许多程序通过向stdout中引出然后返回到行的开始和再次发送来显示进度条.这样他们就可以实现实时进度条的显示.
不幸的是,在许多情况下,此功能在PyCharm的控制台中不起作用.
这是一个关于如何显示keras列车进度条的示例:
即每个进度条更改进入单独的行.
有可能解决这个问题吗?
Keras中有model.summary()方法.它将表打印到stdout.是否可以将其保存到文件中?