我有一个开发和 QA Web 服务器在同一个 EC2 上运行。我创建了一个 shell 脚本(通过 Cron 调用)来检查某个进程是否正在运行,如果没有,则重新启动它。
Shell 脚本:
#!/bin/bash
process="php"
makerun="/usr/bin/php /var/www/html/api/artisan queue:work --queue=high,default --memory=512"
if ps ax | grep -v grep | grep $process > /dev/null
then
exit
else
$makerun &>/dev/null &
fi
exit
这一切都运行良好,但现在是时候启动我们的 QA 服务器(上面是 dev)的工作程序了,显然它不会做任何事情,因为在两种情况下进程名称是相同的。
话虽如此,有人知道确定是什么调用了该进程的方法吗?如果我知道一个是从 dev 路径启动的,那么我可以重写 bash 脚本,使其更加智能,进而监控 dev 和 QA 的进程。
任何见解都将不胜感激!
答案1
我不确定我是否正确理解了你的问题:
在我的 Linux 系统上,ps ax
(或ps -Alf
)已经显示了用于启动相应进程的可执行文件的完整路径(至少在许多情况下)。您最终可以使用它吗?
例如,在运行 Debian Stretch 的盒子上(摘录):
root@charon:~# ps -Alf
4 S message+ 447 1 0 80 0 - 11283 SyS_ep Aug31 ? 00:00:00 /usr/bin/dbus-daemon --system --address=syste
4 S root 468 1 0 80 0 - 11625 SyS_ep Aug31 ? 00:00:03 /lib/systemd/systemd-logind
4 S root 674 1 0 80 0 - 3634 core_s Aug31 tty1 00:00:00 /sbin/agetty --noclear tty1 linux
4 S root 708 1 0 80 0 - 17486 core_s Aug31 ? 00:00:00 /usr/sbin/sshd -D
5 S ntp 712 1 0 80 0 - 24467 core_s Aug31 ? 00:00:36 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 109
因此,要获取完整路径,您必须 grep 每行的最后一部分,例如:
root@charon:~# ps -Alf|awk '{print $15}'
/usr/bin/dbus-daemon
/lib/systemd/systemd-logind
/sbin/agetty
/usr/sbin/sshd
/usr/sbin/ntpd