linux系统中挂起操作和强制结束操作(后台运行程序方法)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux系统中挂起操作和强制结束操作(后台运行程序方法)相关的知识,希望对你有一定的参考价值。

参考技术A 在linux系统中有这两个命令 ctrl+z 和ctrl+c ,这两个命令输入之后看起来结果差不多,实质是不同的。

他们都有中断命令的效果,但是作用是不一样的。

ctrl+c是强制终止程序的执行并结束进程。而ctrl+z则只是中断任务的执行,但该任务并没有被结束。
它只是在进程中维持挂起的状态,用户可以使用fg/bg命令来继续前台/后台执行该任务。fg命令会重启
前台被中断的任务,bg命令会把中断的任务放到后台执行。

你也可以使用bg这样的方法让一个前台执行的任务切换到后台去执行。
也可以使用fg这样的方法让一个后台执行的任务切换到前台去执行。

还有一个最常用的方法是&
在一行命令的最后输入&,可以让这行命令放到后台去运行。

使用jobs命令查看当前有多少后台程序在运行。

检测系统在循环中挂起

【中文标题】检测系统在循环中挂起【英文标题】:Detecting system suspend in a loop 【发布时间】:2018-06-10 16:07:04 【问题描述】:

我正在尝试使用以下算法检测系统挂起:

while True:
    lastchecked = now()
    if now() - lastchecked > 1s: print "suspend detected!"

但是我遇到了一个问题:如果挂起发生在第 2 行和第 3 行之间,那么循环会捕获它。但是如果挂起发生在第一行和第二行之间,那么算法就会失败。

这种情况有什么常用的方法吗?最好是独立于操作系统的,我不想挂钩操作系统事件等。

【问题讨论】:

看起来像XY problem。请添加您想要达到的目标的详细信息 - 一定有比投票更好的方法。 在绝大多数情况下,您不需要检查系统是否挂起——一个设计良好的算法会简单地从它停止的地方继续。这就是系统挂起的全部目的。 我的程序是一种系统监视器类型的应用程序——它需要知道系统是否进入休眠状态以及休眠了多长时间。 【参考方案1】:

首先,polling is inferiour to notifications 因为它浪费了系统资源,而这些资源本来可以花在有用的工作上(你当前的循环也是busy loop)。当然,电源管理事件系统是特定于操作系统的(请参阅Power Management Notifications in Linux 和 how to hook to events / messages in windows using python),但如果您正在编写系统监视器应用程序,无论如何您都无法隐藏操作系统差异。


现在,这里的关键是在内存中总是有两个时间戳并覆盖旧的:

T1
  \
   T2
   <- compare
  / 
T3
 <- compare
  \
   T4
   etc
  /

然后,无论何时发生挂起,下一个时间戳都会设置得比它应该设置的晚,并且比较会看到差异。

这样,您甚至不需要每秒钟左右轮询一次!您的轮询间隔只需与您想要检测的最短暂停时间一样短。例如。如果您想检测至少 30 秒的暂停时间,您只需每 30 秒轮询一次:如果系统睡眠时间更长,则可以保证“错过一个节拍”。

i=0
poll_period=30
t=[time.time()]*2
while True:
    # actually, poll period will be slightly longer due to code overhead:
    # https://***.com/questions/26774186/looping-at-a-constant-rate-with-high-precision-for-signal-sampling
    # but that doesn't make a difference in this case
    time.sleep(poll_period)
    t[i]=time.time()
    if t[i] - t[(i+1)%2] > poll_period + 2: print "suspend detected"
    i = (i+1)%2

请注意you will get false positives if your process gets preempted by others。这也是为什么使用系统通知是一种非常优越的方式的另一个原因。

【讨论】:

如果我想在循环中加入更多的函数调用,放在哪里重要吗? @user2108462 不是真的,但如果它们都在time.sleep() 的同一侧,那可能会更容易——那么您将确定哪个代码的开销是哪个测量间隔的一部分。 【参考方案2】:

我认为这个算法有效:

last1 = now()
last2 = now()
while True:
    last1 = now()
    if now() - last1 > 1s or now() - last2 > 1s: print "suspend detected!"
    last2 = now()
    if now() - last1 > 1s or now() - last2 > 1s: print "suspend detected!"

这将在 while 循环中的任何行之后立即检测到暂停:

第一行之后的挂起将被第二行检测到(因为 last1 将是旧的)。 第 4 行将检测到第二行之后的挂起(因为 last1 将是旧的)。 第 3 行之后的挂起将被第 4 行检测到(因为 last1 和 last2 都将是旧的)。 第 4 行之后的挂起将被第 2 行检测到(因为 last2 将是旧的)。

我相信这是检测系统挂起所需的最少代码量。如果我错了,请纠正我。

【讨论】:

仍然是一个繁忙的循环

以上是关于linux系统中挂起操作和强制结束操作(后台运行程序方法)的主要内容,如果未能解决你的问题,请参考以下文章

Linux中从后台启动进程,应在命令结尾处加上啥符号

Linux系统理论操作学习26LInux的后台运行,重定向输出,前后台进程转换和管理

检测系统在循环中挂起

linux nohup后台运行命令

Linux内核调度分析(转,侵删)

GoogleWebRTC 在 swift 本机应用程序 (OpenVidu) 中挂起(冻结)主线程