数日前、私はスクリプトを書いて、Raspberry Piで起動時に自動的に起動するようにどこかに置きました。
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)を確認してください。
なぜプロセスは2つの個人ですか?
cron は各コマンドをシェルに渡します。 ~からスケジュールされたタスク(5):
行の完全なコマンド部分(改行または「%」文字まで)は、SHELL変数/ bin / shまたはcronfileで指定されたシェルによって実行されます。
次の行がある場合crontab
:
0 * * * * python2.7 /opt/some/script.py
...その後、エントリを実行する必要がある場合(毎時間、毎時間)、cronは/bin/sh
2つの引数を使用して-c
シェル()を実行しますpython2.7 /opt/some/script.py
。
その後、シェルは「-c」以降のすべてを実行するコマンドとして解釈します。単一の引数を使用してpython2.7
fromを見つけて実行します。したがって、シェル(指定した項目を含む)によっては、現在2つのプロセスが実行されている可能性があります。PATH
/opt/some/script.py
/bin/sh
/bin/sh -c python2.7 /opt/some/script.py
/usr/bin/python2.7 /opt/some/script.py
そのため、2つのプロセスと2つのプロセスがps
表示されますが。eibd
python2.7
crontab
一部のシェルは、このような2番目のプロセスをフォークすることを避けることができます。バラより単純なbashコマンドに明白な複製や分岐がないのはなぜですか?
答え2
読むこのリンクRaspberry Piが起動したときにスクリプトを実行する方法はいくつかあります。要約すると、次のようになります。
- ローカルファイル
- .bashrc
- init.dディレクトリ
- システムD
- 予約されたこと
ここでcronを確認したので、1-4を見てください。