У меня есть скрипт Python, который запускается из rc.local, когда загружается мой Raspberry Pi. Сценарий сохранит PID с помощью os.getpid () в виде простого текстового файла.
pid = str(os.getpid())
pidfile = open("garage.pid", "w")
pidfile.write(pid)
pidfile.close()
У меня есть немного кода PHP в моем index.php, который сообщает о состоянии скрипта, читая текстовый файл и проверяя процесс.
<?php
$fileContent = file_get_contents("garage.pid");
$PsStatus = exec("ps -a -p $fileContent >/dev/null && echo \"True\" || echo \"False\"");
if($PsStatus == "True"){
echo "Running";
}
if($PsStatus == "False"){
echo "Stopped";
}
?>
Когда я запускаю вышеупомянутый скрипт Python вручную из оболочки, он работает фантастически. Однако при запуске из /etc/rc.local при загрузке он сохраняет номер PID, но, глядя на запущенные процессы, он не обнаруживается и происходит сбой сценария PHP.
Пример строки, добавленной в rc.local:
(sleep 10;python /path/to/script.py)&
Я пробовал это с использованием -u root в команде ps, но все равно не повезло. Есть мысли здесь?
РЕДАКТИРОВАТЬ: Например, когда я позволяю сценарию запускаться из rc.local при перезагрузке, файл записывается со значением «4126».
Запуск «ps -u root» показывает:
PID TTY TIME CMD
1 ? 00:00:02 init
2 ? 00:00:00 kthreadd
3 ? 00:00:44 ksoftirqd/0
5 ? 00:00:00 kworker/0:0H
6 ? 00:00:00 kworker/u8:0
7 ? 00:00:34 rcu_preempt
8 ? 00:00:00 rcu_sched
9 ? 00:00:00 rcu_bh
10 ? 00:00:00 migration/0
11 ? 00:00:00 migration/1
12 ? 00:00:31 ksoftirqd/1
14 ? 00:00:00 kworker/1:0H
15 ? 00:00:00 migration/2
16 ? 00:00:13 ksoftirqd/2
18 ? 00:00:00 kworker/2:0H
19 ? 00:00:00 migration/3
20 ? 00:00:11 ksoftirqd/3
22 ? 00:00:00 kworker/3:0H
23 ? 00:00:00 khelper
24 ? 00:00:00 kdevtmpfs
25 ? 00:00:00 netns
26 ? 00:00:00 perf
27 ? 00:00:00 khungtaskd
28 ? 00:00:00 writeback
29 ? 00:00:00 crypto
30 ? 00:00:00 bioset
31 ? 00:00:00 kblockd
33 ? 00:00:00 rpciod
34 ? 00:00:00 kswapd0
35 ? 00:00:00 fsnotify_mark
36 ? 00:00:00 nfsiod
42 ? 00:00:00 kthrotld
44 ? 00:00:00 VCHIQ-0
45 ? 00:00:00 VCHIQr-0
46 ? 00:00:00 VCHIQs-0
47 ? 00:00:00 iscsi_eh
48 ? 00:00:00 dwc_otg
49 ? 00:00:00 DWC Notificatio
51 ? 00:00:00 VCHIQka-0
52 ? 00:00:00 SMIO
53 ? 00:00:00 deferwq
54 ? 00:00:01 kworker/u8:2
55 ? 00:00:01 mmcqd/0
56 ? 00:00:00 jbd2/mmcblk0p6-
57 ? 00:00:00 ext4-rsv-conver
58 ? 00:00:03 kworker/2:1
74 ? 00:00:01 kworker/3:1
141 ? 00:00:00 scsi_eh_0
142 ? 00:00:00 scsi_tmf_0
143 ? 00:00:00 usb-storage
178 ? 00:00:00 udevd
302 ? 00:00:00 udevd
308 ? 00:00:00 udevd
417 ? 00:00:00 kworker/0:1H
1093 ? 00:00:00 kworker/2:1H
1591 ? 00:00:01 ifplugd
1593 ? 00:00:04 ifplugd
1616 ? 00:00:04 ifplugd
1619 ? 00:00:07 RTW_CMD_THREAD
1625 ? 00:00:00 wpa_supplicant
2025 ? 00:00:00 rsyslogd
2132 ? 00:00:01 apache2
2226 ? 00:00:00 cron
2266 ? 00:00:00 ntpd
2368 ? 04:14:37 python
2370 ? 00:00:00 startpar
2399 tty1 00:00:00 getty
2400 tty2 00:00:00 getty
2401 tty3 00:00:00 getty
2402 tty4 00:00:00 getty
2403 tty5 00:00:00 getty
2404 tty6 00:00:00 getty
2405 ? 00:00:00 getty
2513 ? 00:00:00 kworker/1:1H
2740 ? 00:00:00 dhclient
2806 ? 00:00:00 sshd
9871 ? 00:00:00 kworker/0:2
9957 ? 00:00:00 sshd
26236 ? 00:00:01 kworker/3:0
26287 ? 00:00:02 kworker/0:0
26555 ? 00:00:00 kworker/2:2
31051 ? 00:00:00 kworker/1:1
31127 ? 00:00:01 kworker/1:2
Я решил свою проблему, используя метод crontab (@reboot) для запуска сценария python при перезагрузке. Это, очевидно, позволяет избежать проблем с использованием rc.local и попыткой использовать os.getpid в python. Во всяком случае, все работает сейчас, и я счастлив! Спасибо всем за помощь.
Запустите ‘crontab -e’ и добавьте следующее:
@reboot cd /pathto/scripts && sudo python script.py &
Удален / закомментирован код из rc.local.
Других решений пока нет …