如何在Udev事件上运行长时间的进程?


11

我想在连接USB调制解调器时运行ppp连接,所以我使用以下udev规则:

ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="16d8",\
    RUN+="/usr/local/bin/newPPP.sh $env{DEVNAME}"

(我的调制解调器显示/devttyACM0

newPPP.sh:

#!/bin/bash
/usr/bin/pon prov $1 >/dev/null 2>&1 &

问题:

udev事件触发,并newPPP.sh正在运行,但newPPP.sh过程后〜4-5s杀害。ppp没有时间进行连接(拨号超时为10秒)。

我如何运行一个长时间的过程,而这一过程不会被杀死?

我尝试使用nohup,但它也不起作用。

系统:Arch Linux

更新资料

感谢maxschlepzig,我在这里找到了解决方案。

我以前是at now用来运行与udev进程分离的工作的。

但还有一个问题没有答案:为什么nohup&不工作?

Answers:


11

如果在systemd支持下运行良好的发行版,则最简单,技术上最安全的方法是使用设备单元

这样,systemd将完全控制长时间运行的脚本,甚至在设备关闭/卸下后甚至能够正确终止进程-分离进程意味着您将放弃对进程状态的完全控制及其历史。

除此之外,您还可以通过运行来检查设备及其附加服务的状态systemctl status my-ppp-thing.device

另请参阅此博客文章,以获取更多示例和详细信息。


6

如今,udev使用cgroups进行n个销毁任务。一种解决方案是使用“现在”或“批处理”。另一个解决方案是将双叉和“重定位”到另一个cgroup。这是一个示例python代码(类似的代码可以用任何语言编写):

os.closerange(0, 65535)  # just in case
pid = os.fork()
if not pid:
  pid = os.fork()  # fork again so the child would adopted by init
  if not pid:
    # relocate this process to another cgroup
    with open("/sys/fs/cgroup/cpu/tasks", "a+") as fd:
      fd.write(str(os.getpid()))
    sleep(3)  # defer execution by XX seconds
    # YOUR CODE GOES HERE
sleep(0.1)  # get forked process chance to change cgroup

调试输出可以发送到例如syslog。


1
udev为什么要竭尽全力销毁生成的进程?
user30747 '18

我猜这是因为udev启动的程序阻止了守护进程(例如,将udev规则连接到插入外部显示器,长时间运行的程序将阻止实际使用新的显示器)。我敢肯定,这背后有其自身的技术推理,但是这意味着产生的进程会占用系统的主要部分,因此需要杀死。
tobek

2

Shell具有在后台运行命令的能力:

(

lots of code

) &

用大括号和符号分组的命令将在子外壳中异步执行。当插入和切换USB调制解调器时,我用它来自动连接。它大约需要20秒,并且在udev下可以正常工作。


在这种情况下,您可能想重定向stderr,stdout和stderr。
mdpc

@mdpc嗯...为什么?我看到usb_modeswitch在这种情况下关闭了流:exec 1 <&-2 <&-5 <&-7 <&
user42295 2013年

1

我让它与setid一起使用。我的udev规则的RUN部分:

RUN+="/bin/bash script.sh"

然后在脚本中:

#!/bin/bash
if [ "$1" != "fo_real" ]; then
  /usr/bin/setsid $(/usr/bin/dirname $0)/$(/usr/bin/basename $0) fo_real &
  exit
fi

Rest of script is here....

对脚本的第一次调用以退出状态0返回,但是对脚本的第二次调用以PPID = 1继续运行。


0

可能是因为其父进程已终止,并且终止信号传播到其子进程,而子进程不会阻止它(并且SIGKILL即使它们不能阻止)。

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.