手机terminal 运行java后台运行的问题

关于后台运行py小程序的问题,请大家指教-电子产品世界论坛
关于后台运行py小程序的问题,请大家指教
我这两天在学习树莓派,现在在尝试让pi开机就在后台启动一个程序,获取pi的CPU、GPU、内存占用率、CPU使用率,并将数据上传到yeelink上。但是问题来了:
1、每次开机的确都是能够自启动,但是程序只能前半部分,获取CPU、GPU温度,并且将后半截程序跳过,再回去循环执行前半截;
2、如果我在terminal里面python程序在后台运行,他只能执行前半部分到获取GPU温度,之后就死了;
3、这个程序如果我不让他在后台执行,直接在terminal里面执行的话,他有时能够完全执行的,
所以我想请问,有没有知道这具体是什么原因造成的?或者说我的程序里面哪些句子是不能在后台运行的?下面的是我的程序代码
#!/usr/bin python
# -*- coding: utf-8 -*-
import requests
import json
import time
import string
import commands
def getcpu():
return(os.popen("top -n1"))#获取CPU的情况的函数
while True:
&&&&&&&&#获取CPU温度
file = open("/sys/class/thermal/thermal_zone0/temp")
temp=float(file.read())/1000
file.close()
apiurl_cpu='http://api.yeelink.net/v1.0/device/17020/sensor/29454/datapoints'
apiheaders={'U-Apikey':'08fc4e36ad2d49c3eb830de6bd6bad2d','content-type':'application/json'}
payload_cpu={'value':temp}
print temp
r=requests.post(apiurl_cpu,headers=apiheaders,data=json.dumps(payload_cpu))
#获取GPU的温度
gpu_temp=commands.getoutput('/opt/vc/bin/vcgencmd measure_temp').replace('temp=','').replace('\'C','')
apiurl_gpu='http://api.yeelink.net/v1.0/device/17020/sensor/29599/datapoints'
payload_gpu={'value':gpu_temp}
print gpu_temp
r=requests.post(apiurl_gpu,headers=apiheaders,data=json.dumps(payload_gpu))
#以下是调用函数获取CPU使用率以及内存的使用情况
cpuused=getcpu()
for cpuline in cpuused:
if cpuline[:3]=="%Cp":
CPU_Used=cpuline.split(":")[1].split(",")[0].split(" ")[-2]
payload_CPU_Usage={'value':CPU_Used}
apiurl_CPU_Usage='http://api.yeelink.net/v1.0/device/17020/sensor/29648/datapoints'
print CPU_Used
if "Mem:" in cpuline:
MemTotal=cpuline.split(":")[1].split(",")[0].strip("total").split(" ")[-2]
MemUsed=cpuline.split(":")[1].split(",")[1].strip("used").split(" ")[-2]
MemUsedRate=float(str(MemUsed))/float(str(MemTotal))
MemUsedRatio="%.2f"%(MemUsedRate*100)
apiurl_mem='http://api.yeelink.net/v1.0/device/17020/sensor/29600/datapoints'
payload_mem={'value':MemUsedRatio}
print MemUsedRatio
r=requests.post(apiurl_mem,headers=apiheaders,data=json.dumps(payload_mem))
print "===================="
time.sleep(30)
这个不懂,给你在群里问问
建议楼主关注一下数据变量的格式
以前遇到过这种问题,只是记得是由于这种变量格式和linux存储格式之间有不配合的情况造成的
不会是传说中的字节对齐问题吧~~
我这没有验证环境,你的程序里有http协议的内容,如果异常,也可能是网络原因造成的
这个实验不错,有机会也尝试一下,一起找问题
匿名不能发帖!请先 [
Copyright (C) 《电子产品世界》杂志社 版权所有Linux-请允许我静静地后台运行Linux-请允许我静静地后台运行大秘密百家号前言常在 linux 下玩耍的开发者肯定会经常遇到需要对进程调度的情况,在 windows 中点击 最小化去干别的就 OK 了,那么在 linux 下怎么办呢。可能有的小伙伴会说,再开一个终端窗口不就好了么。可是开很多窗口管理会很不方便,还有万一手贱点了x,或者长时间不操作,远程终端断开了连接,进程停止了,再次打开,又是一番折腾。今天来介绍几个命令,帮大家系统地梳理一下 linux 的进程调度,并附上一些自己的使用心得和踩过的坑。名词在此之前,我们必须(当然也不是必须,但了解原理有利于理解和解决错误)先弄懂几个名词。进程组进程组是一个或多个进程的集合,进程组方便了对多个进程的控制,在进程数较多的情况下,向进程组发送信号就行了。它的 ID 由它的组长进程的进程 ID 决定。组长进程创建了进程组,但它并不能决定进程组的存活时间,只要进程组内还有一个进程存在,进程就存在,与组长进程是否已终止无关。会话会话(session)是一个或多个进程组的集合,它开始于用户登陆终端,结束于用户退出登陆。其义如其名,就是指用户与系统的一次对话的全程。会话包括控制进程(与终端建立连接的领头进程),一个前台进程组和任意后台进程组。一个会话只能有一个控制终端,通常是登录到其上的终端设备或伪终端设备,产生在控制终端上的输入和信号将发送给会话的前台进程组中的所有进程。控制终端每当我们使用终端工具打开一个本地或远程 shell,我们便打开了一个控制终端,通过 ps命令可以查看到 command 为ttyn的就是它对应的进程了,同时它对应 linux/dev/目录下的一个文件。作业作业的概念与进程组类似,同样由一个或多个进程组成,它分为前台作业和后台作业,一个会话会有一个前台作业和多个后台作业,与进程组不同的是,作业内的某个进程产生的子进程并不属于这个作业。类比以上几个概念可以类比为我们一次通过 QQ 聊天的全程,控制终端就是 QQ软件,关闭了此软件代表着聊天结束。聊天时发送的每一条信息都是一个进程,作业或进程组就是我们在聊的某一件事,它由很多条相互的信息构成。而会话则是我们指我们从开始聊天到结束聊天的全过程,可能会聊很多个事。它们之间的相关图如下所示:后台执行我们每次在终端窗口执行命令的时候,进程总会一直占用着终端,走到进程结束,这段时间内,我们在终端的输入是没有用的。而且,当终端窗口关闭或网络连接失败后,再次打开终端,会发现进程已经中断了。这是因为用户注销或者网络断开时,SIGHUP信号会被发送到会话所属的子进程,而此SIGHUP的默认处理方式是终止收到该信号的进程。所以若程序中没有捕捉该信号,当终端关闭后,会话所属进程就会退出。我们要实现后台执行的目的,实际上是要完成如下两个目标:使进程让出前台终端,让我们可以继续通过终端与系统进行交互。使进程不再受终端关闭的影响,即系统在终端关闭后不再向进程发送 SIGHUP信号或即使发送了信号程序也不会退出。以下的命令就围绕着这两个目标来实现。&首先是我们最经常遇到的符号 &,将它附在命令后面可以使进程在后台执行,不会占用前台界面。它实际上是在会话中开启了一个后台作业,对作业的操作我们后面再说。但我们会发现,如果此时终端被关闭后,进程还是会退出。这是因为,&符号只有让进程让出前台终端的功能,无法让进程不受SIGHUP信号的影响。nohupnohup应该是另外一个我们常用的命令了,它的作用如其字面意思,使进程不受SIGHUP信号的影响。但我们在使用nohup php test.php后会发现,进程还会一直占用前台终端,但即使终端被关闭或连接断开了,程序还是会执行,另外我们会发现在当前文件夹下多了个名为nohup.out的文件。这是因为 nohup 的功能仅仅是让进程不受 SIGHUP信号的影响,并不会让出前台终端,而且它还会在命令执行目录下建立nohup.out用以存储进程的输出。如果进程不需要输出,且不想让 nohup 创建文件,可以将标准输出和标准错误输出重定向。我们常将 nohup和&搭配到一块使用,执行命令如下nohup command &/dev/null 2&&1 &这样,就可以放心的等待进程运行结果了。setsidsetsid 是另一个让进程在后台执行的命令,它的作用是让进程打开一个新的会话并运行进程,使用方式为 setsid command。根据上面的概念我们得知终端关闭后进程退出是因为会话首进程向进程发送了 SIGHUP信号,setsid 就厉害了,它直接打开一个新的会话来执行命令,那么原会话的终端的状态就再也不会影响到此进程了。我们使用 pstree来查看使用setsid和nohup ... &两种命令来运行进程时的进程树状态。nohup php test.php &pstree -a |grep -C 6 tes\n
| `-sudo -\n
| |-grep -C 6 tes\n
| |-php test.ph\n
| `-pstree -a我是用 ssh 远程登陆的机器,所以 test.php 进程是挂在 sshd 进程下的。正常情况下,一旦 sshd 进程结束,则 test.php也无法幸免。setsid php test.phppstree -a |grep -C 6 test\n
|-php test.ph\n
|-php-fp\n -\n
`-sshd使用了 setsid 后,test.php 进程已经与 sshd 进程同级,属于 init 进程的子进程了。但是 setsid 并没有为进程分配一个输出终端,所以进程还是会输出到当前终端上。setsid的坑另外,setsid 有个略坑的地方: 在终端中直接使用 setsid command运行进程时,终端前台并不会被影响,command 会在后台默默运行。而在 shell 脚本中,我们会发现运行 setsid 的进程会一直阻塞住,直到 command 进程执行结束。这是因为,setsid 在其是进程组长时会 fork一个进程,但它不会wait它的子进程,而是立刻退出,所以在终端内直接使用 setsid 时,setsid 作为进程组长不会占用终端界面。而在 shell 脚本内,setsid 不是进程组长,它不会 fork子进程,而是由 bash 来fork一个子进程,而 bash 会wait子进程,所以表现得像 setsid 在wait子进程一样。要解决这个问题,有两个办法:使用上面介绍的 &符号,使 setsid 强行到后台执行。使用 .或source命令由终端执行 setsid;其他除了上面介绍的命令,还有 screen 和 tmux 等会话工具,他们都有自己的一套规范,也比较复杂,掌握本文的命令已经足够你驰骋 linux 进程控制了。当然有想了解新知识的可以查询学习一下,应该会比基础命令好用。作业命令使用上面的后台执行命令时可能还会遇到一些小状况:被我们放在后台的进程执行时间过长,而我们又忘记使用 nohup 命令,那么终端一旦断开,进程又需要被重新执行。我们直接开启了某个进程,又想在不中断进程的情况下让它让出前台终端;这些都要牵涉到今天的第二个模块--作业;我们在终端里运行的命令都可以理解为一个作业,有的占用前台终端,有的在后台默默执行,下面的命令就是为了调度这些作业。jobsjobs 是作业的基础命令,用它可以查看正在运行的作业的信息,其输出如下:job\n[1]-
Running php test.php &\n[2]+
Stopped php test.php前面内的数字是作业 ID,也是后面我们要操作作业的标识,然后是作业状态和命令。ctrl+zctrl+z严格来说并是作业命令,它只是向当前进程发送一个SIGSTOP信号,促使进程进入暂停(stopped)状态,此状态下,进程状态会被系统保存,此进程会被放置到作业队列中去,而让出进程终端。使用它,我们可以暂停正在占用终端的进程而不停止它,从而让我们使用终端命令来操作此进程。bgbg是 backgroud的缩写,顾名思义,bg %id把作业放到后台进程中执行。结合 ctrl+z和bg命令,我们可以解决上面提出的第一个问题,不停止地将正在占用终端的进程放到后台执行。fgfg 与 bg 相对,使用它可以把作业放到前台来执行。disowndisown 用来将作业从作业列表中移除,即使它 不属于会话,这样终端关闭后不再向此作业发送SIGHUP信号,以阻止终端对进程的影响。使用 disown 我们可以解决上面提出的第二个问题,不重新执行将一个没使用 nohup 命令的进程不受终端关闭影响。守护进程以上介绍的都是一些临时进程的处理,后台运行的进程的最终方法是将进程变成守护进程。守护进程(daemon)是生存期较长的一种进程,一般在系统启动时启动,系统关闭时停止,没有控制终端,也不会输出。如我们的服务器、fpm 等进程就是以守护进程的形式存在的。创建过程要创建一个守护进程,步骤为:必选项fork子进程,退出父进程,子进程作为孤儿进程被 init 进程收养;使用 setsid, 打开新会话,进程成为会话组长,正式脱离终端控制;设置信号处理(特别是子进程退出处理);可选项:使用 chdir改变进程工作目录,一般到根目录下,防止占用可卸载文件系统;用 umask重设文件权限掩码,不再继承父进程的文件权限设置;关闭父进程打开的文件描述符;代码本文仅代表作者观点,不代表百度立场。系作者授权百家号发表,未经许可不得转载。大秘密百家号最近更新:简介:浅谈手机充电安全注意事项与快速充电作者最新文章相关文章如何在终端使用后台运行模式启动一个Linux应用程序
这是一个篇幅不长但是十分有用的教程,可以帮助你在终端启动一个Linux应用程序,并且使终端窗口不会丢失焦点。
我们有很多可以在Linux系统中打开一个终端窗口的方法,这取决于你的选择以及你的桌面环境。
如果是使用Ubuntu的话,你可以利用CTRL+ALT+T组合键打开终端。当然你也可以使用超级键(Windows键),搜索&TERM&,然后点击&Term&图标来打开终端窗口。
对于其他的桌面环境来说,例如XFCE、KDE、LXDE、Cinnamon以及MATE,你可以在菜单中找到终端。有些环境会在停靠栏或者面板上面包含终端图标。
通常情况下,你可以在终端里面直接输入应用程序名来启动一个应用程序。比如说,你可以通过输入&firefox&来启动Firefox。
在终端启动应用程序的好处是,你可以包含一些额外的参数。
例如,你可以通过下列命令来打开一个Firefox浏览窗口,然后利用默认的搜索引擎搜索相关信息:
firefox -search "linux.cn"
你可能会注意到,如果你启动Firefox,程序打开以后,回到了终端窗口控制,这就意味着你可以继续在终端进行工作。
通常情况下,如果你在终端启动了应用程序,控制会切换到新启动的应用程序,只有程序被关闭以后才会重新切换到终端控制。这是因为你在前台启动了这个程序。
如果要在Linux终端打开应用程序并且返回终端控制,那么你需要将应用程序启动为后台进程。
和下面所列的命令一样,我们可以通过增加一个(&)符号,将应用程序在后台启动。
libreoffice &
译者注:如果需要加参数的话,记得把&符号放在最后。
译者注:一般情况下,关闭终端时,在这个终端启动的后台程序也会被终止,要使终端关闭以后,后台程序依然保持执行可以使用下列命令
nohup command [arg...] &
如果应用程序目录没有安装在PATH变量包含的目录里面的话,我们就没有办法直接通过应用程序名来启动程序,必须输入应用程序的整个路径来启动它。
/path/to/yourprogram &
如果你不确定程序输入哪个Linux目录结构的话,可以使用或者命令来定位它。
可以输入下列符号来找到一个文件:
find /path/to/start/from -name programname
例如,你可以输入下列命令来找到Firefox:
find / -name firefox
命令运行的结果会嗖的一下输出一大堆,别担心,你也可以通过或者来进行分页查看。
find / -name firefox | more
find / -name firefox | less
当find命令查找到没有权限访问的文件夹时,会报出一条拒绝访问错误,
你可以通过。当然,如果你没有安装sudo的话,就只能切换到一个拥有权限的用户了。
sudo find / -name firefox | more
如果你知道你要查找的文件在你的当前目录结构中,那么你可以使用点来代替斜杠:
sudo find . -name firefox | more
你可能需要sudo来提升权限,也可能根本就不需要,如果这个文件在你的主目录里面,那么就不需要使用sudo。
有些应用程序则必须要提升权限才能运行,否则你就会得到一大堆拒绝访问错误,除非你使用一个具有权限的用户或者使用sudo提升权限。
这里有个小窍门。如果你运行了一个程序,但是它需要提升权限来操作,输入下面命令试试:
作者:&译者:&校对:
本文由&&原创翻译,&荣誉推出
上一篇:下一篇:
评论功能关闭
根据国家法律法规要求,本站暂时关闭文章评论功能。开放时间不确定。我们将谋求一种可以让大家更好的发表意见的方式。
根据国家法律法规要求,只有实名认证后才可以发表评论。
共计翻译: 8 篇
| 共计贡献: 23 天
贡献时间: -&
这是一个篇幅不长但是十分有用的教程,可以帮助你在终端启动一个Linux应用程序,并且使终端窗口不会丢失焦点。我们有很多可以在Linux系统中打开一个终端窗口的方法,这取决于你的选择以及你的桌面环境。如果是使用Ubuntu的话,你可以利用CTRL+ALT+T组合键打开终端。
分享到微信
打开微信,点击顶部的“╋”,
使用“扫一扫”将网页分享至微信。
请将我们加入您的广告过滤器的白名单,请支持开源站点。谢谢您。他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 运行terminal 的文章

 

随机推荐