是什么开始了这个过程?

是什么开始了这个过程?

几天前,我编写了一个脚本并将其放在某个地方,以便在我的树莓派上启动时自动启动它。

ps -ax给我:

 2041 ?        S      0:00 /usr/sbin/apache2 -k start
 2064 ?        Ss     0:00 /usr/sbin/cron
 2067 ?        S      0:00 /USR/SBIN/CRON
 2068 ?        S      0:00 /USR/SBIN/CRON
 2072 ?        Ss     0:00 /bin/sh -c eibd -t 1023 -S -D -R -T -i --no-tunnel-cl...
 2073 ?        Ss     0:00 /bin/sh -c python2.7 /opt/scripts/nibe_uplink/main.py
 2074 ?        S      0:00 eibd -t 1023 -S -D -R -T -i --no-tunnel-client-queuin...
 2075 ?        Rl     1:25 python2.7 /opt/scripts/nibe_uplink/main.py

pid 2074 是从 开始的/etc/crontab。 pid 2075 开始于crontab -e

如何找到pid 2073从哪里开始?

答案1

是什么开始了这个过程?

您可以通过添加( ) 来给出“长”输出,或者通过专门请求:ps来查找每个进程的父进程:-lps -axlppid

ps -o ppid 2074
 PPID
2072

对 2072 重复一遍,看看是什么开始了(可能是 CRON)。

为什么要两个进程?

cron 将每个命令传递给 shell。从定时任务(5):

该行的整个命令部分(直到换行符或“%”字符)将由 /bin/sh 或 cronfile 的 SHELL 变量中指定的 shell 执行。

如果您有以下行crontab

0 * * * * python2.7 /opt/some/script.py

...然后,当该条目需要运行时(每小时,整点),cron 会使用/bin/sh两个参数-c和执行 shell ( ) python2.7 /opt/some/script.py

然后 shell 将“-c”后面的所有内容解释为要运行的命令。它查找python2.7fromPATH并使用单个参数执行它/opt/some/script.py。因此,根据您的 shell(包括/bin/sh指向的内容),现在可能有两个进程正在运行:

  • /bin/sh -c python2.7 /opt/some/script.py
  • /usr/bin/python2.7 /opt/some/script.py

这就是为什么ps向您显示 2 个eibd进程,以及 2 个python2.7进程,尽管您的crontab.

有些 shell 可能会避免像这样分叉第二个进程。看为什么简单的 bash 命令中没有明显的克隆或分叉以及它是如何完成的?

答案2

阅读这个链接告诉我有多种方法可以在树莓派启动时运行脚本。总而言之,它们是:

  1. 本地文件
  2. .bashrc
  3. init.d目录
  4. 系统D
  5. 定时任务

既然您已经检查过 cron,请尝试查看 1-4。

相关内容