几天前,我编写了一个脚本并将其放在某个地方,以便在我的树莓派上启动时自动启动它。
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
来查找每个进程的父进程:-l
ps -axl
ppid
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.7
fromPATH
并使用单个参数执行它/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 命令中没有明显的克隆或分叉以及它是如何完成的?