在C语言代码中,要执行shell命令,一般会调用system函数或者popen函数。最近遇到一个问题,就是用system调用一个Python程序在后台运行,常规操作如下

char pythonCmd[50];
snprintf(pythonCmd,50,"cd xxpath && nohup python3 xxx.py &");
if(system(pythonCmd) == -1)
    printf("exec cmd error");

这时候在终端界面上会打印出

nohup: appending output to 'nohup.out'

        我不需要这个打印,于是开始在命令上想办法,什么重定向到空文件,尝试了很多还是不行,还是会打印出来。

        换个思路,用system调用不行,那换个方法,选用popen,因popen会把标准输出到一个buff里,这样就不会打印出来

        popen()函数通过创建一个管道,调用fork()产生一个子进程,执行一个shell以运行命令来开启一个进程。可以通过这个管道执行标准输入输出操作。这个管道必须由pclose()函数关闭,必须由pclose()函数关闭,必须由pclose()函数关闭,而不是fclose()函数(若使用fclose则会产生僵尸进程)。pclose()函数关闭标准I/O流,等待命令执行结束,然后返回shell的终止状态。如果shell不能被执行,则pclose()返回的终止状态与shell已执行exit一样。

FILE *p_file = NULL;
char pythonCmd[50];
snprintf(pythonCmd,50,"cd xxpath && nohup python3 xxx.py &");
p_file = popen(pythonCmd,"w");//此处选'r'或者'w'需要自己根据需求去选择,本次我只是执行命令,并不关心输出是什么,所以选用'w'
if(!p_file)
    printf("exec pythonCmd faild");
pclose(p_file);

换成popen后,nohup提示打印还是会出来,不过这次换了

nohup: redirecting stderr to stdout

如何去掉以上的提示打印,只需要在'&'之前加上2>&1

        其中2>表示把标准错误stderr重定向,“>”后面可以跟文件名,或者&1,&2,分别表示重定向到标准输出和标准错误。修改以上代码如下

FILE *p_file = NULL;
char pythonCmd[50];
snprintf(pythonCmd,50,"cd xxpath && nohup python3 xxx.py >dev/null/ 2>&1 &");
p_file = popen(pythonCmd,"r");
if(!p_file)
    printf("exec pythonCmd faild");
//pclose(p_file);  //需要注意的是,假如放在popen执行的后台程序需要一直运行,则在这里不能pclose,需要在主程序确认退出,后天程序也退出的情况下,执行pclose

这时候就没有了nohup的提示打印,虽然是一个小问题,但是也挺折腾。 

在C语言代码中,要执行shell命令,一般会调用system函数或者popen函数。最近遇到一个问题,就是用system调用一个Python程序在后台运行,常规操作如下char pythonCmd[50];snprintf(pythonCmd,50,"cd xxpath && nohup python3 xxx.py &");if(system(pythonCmd) == -1){ printf("exec cmd error");}这时候在终端界面上会打印
流与输出重定向 流就是读一点数据, 处理一点点数据 重定向,是什么意思呢?简单来说,就是我们可以把本来要显示在终端的命令结果,输送到别的地方:到文件中或者作为其他命令的输入(命令的链接,或者叫命令管道)。 > :重定向到文件中。如果文件已存在,则覆盖文件内容;文件不存在,则创建文件。 >> :重定向到文件末尾。如果文件不存在,则创建文件。 > 和 >> 符号只是将标准输出重定向到文件,并不能将标准错误输出重定向到文件。 那么我们要重定向标准错误输出,该怎么办呢?
最近发现在用服务器上用nohup后台运行matlab命令时,输入回车后总是有“nohup: redirecting stderr to stdout”这样的提示,我的命令是这样的: nohup matlab -nodisplay -nojvm your_matlab_output_file &   回车后如何避免以上的提示呢,只需要将“&”改为“2>&1 &”就OK了,以上命令则为:
在生产环境下启动Weblogic时,发现原来好好的nohup信息输出到指定文件中的功能,突然出问题了。现象是控制台输出的信息一部分输出到了我指定的文件,另一部分却输出到了nohup.out,而我是不想让它产生nohup.out文件,不知道是什么原因。 我的启动命令是这样的: nohup bin/startManagedServer.sh myserver htp://192.168.0.1 -Xm...
Spring boot程序调用服务器上的sh脚本,sh脚本执行过程中会输出日志信息到nohup.out文件,但是会丢失信息,原命令是这样的 nohup sh /test/test.sh >/test/nohup.out & 这样命令是可以执行的,但是有些报错信息的话就看不到了,所以,看了很多博客后才找到解决办法。那就是在 nohup.out & 中间加入“2>&amp...
如果要让 jar 包在后台一直运行(即使断开连接) 要使用到两个命令,第一个是nohup 输出日志文件   & 后台继续运行 我的命令是 nohup>nohupGps java -jar consumerGps.jar & nohup>nohupGps  重定向到 nohupGps 这个文件中 然后出现了  nohup: redirecting stderr to stdou 解决办法:
在生产环境下启jar包时,发现原来好好的nohup信息输出到指定文件中的功能,突然出问题了。现象是控制台输出的信息一部分输出到了我指定的文件,另一部分却输出到了nohup.out,而我是不想让它产生nohup.out文件,不知道是什么原因。 我的启动命令是这样的: nohup java -jar eureka-server.jar> ../logs/eureka-server.out& 现在指行这个命令,会给我产生两个文件,一个中logs/myserver.out,另一个是nohu...
在生产环境下启动Weblogic时,发现原来好好的nohup信息输出到指定文件中的功能,突然出问题了。现象是控制台输出的信息一部分输出到了我指定的文件,另一部分却输出到了nohup.out,而我是不想让它产生nohup.out文件,不知道是什么原因。 我的启动命令是这样的: nohup bin/startManagedServer.sh myserver htp://192.168.0.1