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>&...
如果要让 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