运行过程完成时发出警报


21

有在这里被惊动了几个问题,答案就当一个进程完成/退出(12) -但所有这些假设用户已经发出该方法本身,因此可以内置入一个警告脚本它控制脚本,或将过程通过管道发送给某种警报。

我的情况是,我希望收到用户未初始化的过程的完成/退出的警报。即,我正在Ubuntu 12.04 LTS服务器上批量处理大量视频文件。这些文件上的某些操作需要很长时间,因此,当一个特定的操作完成时,我想发出某种警报(发送电子邮件会很棒)。他们花了很长时间,以至于一次完全基于PIT手动完成此操作。

为了提供更多信息-假设我正在处理一个特别大的文件,并且我看到它已经发展成FFMPEG脚本,该过程本身就是python脚本(这很复杂,不是我自己编写的,还有其他我不希望进行修改–尽管这是第一种合乎逻辑的方法。我想象发出一个带有所述正在运行的python脚本的PID作为参数的命令或脚本,并且当不再运行具有该PID的进程时,警报脚本将执行其操作。

有任何想法吗?


monitmmonit.com/monit/documentation)似乎是一个潜在的选择,但比我需要的要复杂得多-希望可以有一种更简单,更直接,更轻松的方法来仅执行我要问的事情,而不再。
加密狗

Answers:


9

我写了process_watcher.py

process_watcher --pid 1234 --to me@gmail.com

目前,电子邮件正文如下所示:

PID 18851:/usr/lib/libreoffice/program/soffice.bin --writer --splash-pipe = 5
开始:3月10日星期四18:33:37结束:3月10日星期四18:34:26(持续时间0 :00:49)
内存(当前/峰值)-驻留:155,280 / 155,304 kB虚拟:1,166,968 / 1,188,216 kB

[+] indicates the argument may be specified multiple times, for example:
 process-watcher -p 1234 -p 4258 -c myapp -c "exec\d+" --to person1@domain.com --to person2@someplace.com

optional arguments:
  -h, --help            show this help message and exit
  -p PID, --pid PID     process ID(s) to watch [+]
  -c COMMAND_PATTERN, --command COMMAND_PATTERN
                        watch all processes matching the command name. (RegEx pattern) [+]
  -w, --watch-new       watch for new processes that match --command. (run forever)
  --to EMAIL_ADDRESS    email address to send to [+]
  -n, --notify          send DBUS Desktop notification
  -i SECONDS, --interval SECONDS
                        how often to check on processes. (default: 15.0 seconds)
  -q, --quiet           don't print anything to stdout

如果需要任何改进,请停止GitHub问题。


23

像这样吗

(while kill -0 $pid; do sleep 1; done) && echo "finished"

替换$pid为进程ID以及echo "finished"退出进程后要执行的任何操作。

例如:

(while kill -0 $pid; do sleep 1; done) && mail ...

现象!奇迹般有效。
加密狗

1
次要(可能很明显)的注释–当该进程不属于用户所有时,必须对终止执行sudo。
加密狗

1
@dongle,至少在我的RHEL框上,kill -0报告No such process不存在的pid和Operation not permitted其他用户拥有的pid,因此也许解释错误消息应避免需要sudo
iruvar 2014年

1
如果您正在回声,则可以始终这样做echo -en "\007 \007 \007",这将发出终端“铃声”。是否转换为实际的可听声音取决于您的终端和硬件(但通常如此)。
Morgon 2014年

5

&&当第一个命令成功完成时,我用来执行第二个命令。这里有一些例子:

  1. 删除一个大文件夹并发出哔声:

    rm -rv ~/tmp && beep
  2. 编译内核并发送电子邮件:

    make && mail -s "Compilation is done" user@yourmaildomain.com

这是解决您的问题的好方法吗?在另一种情况下,可以||在失败的情况下添加第三个命令。

此外,shell脚本可以接收命令的退出状态$?),使用if/elseand循环,您可以执行所需的任何操作。


谢谢Willian,但是正如我所说,用例中的特殊挑战是这不是我正在发出的命令,而是已经运行的过程。因此,&&不是一个选择。不管怎么说,还是要谢谢你。
加密狗

4

如果没有pid,它将一直运行到ffmpeg的所有实例完成为止:

(while pidof ffmpeg | grep -q "[0-9]?"; do sleep 1; done) && echo "finished"

0

如果您不想使用轮询选项或外部脚本,并且已经启动了长时间运行的进程,则可以使用CTRL + Z挂起它(发送SIGTSTP信号),然后使用fg(将进程移动到前景)。

例如:

my_command  # long running command
# press CTRL+Z to pause
fg ; notify-send 'finished'

除了...“我的情况是,我希望收到用户未初始化的过程的完成/退出通知。”
杰夫·谢勒

-1

我制作了一个应用程序,该应用程序将在流程结束时向您的Android手机发送通知,因此您不必将其绑定到计算机上。

安装,然后添加;notifier.sh到命令末尾。

例如,如果您的命令是,则可以执行以下make install命令:

make install; notifier.sh

https://notifier.sh

https://play.google.com/store/apps/details?id=sh.notifier


“……但是所有这些都假定用户已经发布了所述过程,因此可以使用内置在管理脚本中的警报来编写该脚本的脚本,或者将该过程传递给某种警报。/我的情况是,我希望收到用户未初始化的流程的完成/退出通知。”
G-Man说'Reinstate Monica'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.