检查 shell 可执行程序是否正在运行

检查 shell 可执行程序是否正在运行

在 Ubuntu 中是否可以检查以下 shell 可执行文件是否正在运行?可执行文件的名称是ibgateway.当我运行时htop,我看到的命令如下,这意味着它当前正在运行。

 /bin/sh -c nohup "/home/user1/Jts/ibgateway/978/ibgateway" "-J-DCHANNEL=latest" "-J-DchannelChanged=false" "-J-DjtsConfigDir=/home/user1/Jts" "-J-Drestart=jdapbbikegkmhgpnhhk

我已经尝试过,但尽管正在运行,pgrep ibgateway但它没有返回任何内容。ibgateway我正在寻找一种从终端检查上述进程是否正在运行的方法。

更新

user1@SFO:~$ cat /proc/11965/comm
sh

user1@SFO:~$ cat /proc/11965/cmdline
/bin/sh-cnohup "/home/user1/Jts/ibgateway/978/ibgateway" "-J-DCHANNEL=latest" "-J-DchannelChanged=false" "-J-DjtsConfigDir=/home/user1/Jts" "-J-Drestart=jdapbbikegkmhgpnhhkpeglncdomifcjhpdimcbe"  > /dev/null 2>&1

答案1

你的命令应该是:

/bin/sh -c 'nohup "/home/user1/Jts/ibgateway/978/ibgateway" '\
'"-J-DCHANNEL=latest" "-J-DchannelChanged=false" '\
'"-J-DjtsConfigDir=/home/user1/Jts" '\
"-J-Drestart=jdapbbikegkmhgpnhhk"'

所有这些"都是不必要的,因为它们没有可以保护的特殊字符。最后甚至还失踪了一个。

可能的解决方案

系统D

处理这个问题的最佳方法可能是使用 SystemD。创建一个单元文件,使用 启动服务systemctl start ibgateway.service并使用 查询其状态systemctl status ibgateway.service。不需要sh,不需要`nohup。

您甚至不必创建单元文件,您只需使用systemd-run(作为非root):

$ systemd-run --user ./testscript.sh
Running as unit: run-r1422e75c673a4439aaacefd0df118a51.service

$ systemctl --user status run-r1422e75c673a4439aaacefd0df118a51.service
● run-r1422e75c673a4439aaacefd0df118a51.service - /home/hl/tmp/./testscript.sh
     Loaded: loaded (/run/user/1000/systemd/transient/run-r1422e75c673a4439aaacefd0df118a51.service; transient)
  Transient: yes
     Active: active (running) since Sat 2020-08-08 02:36:57 CEST; 26s ago
   Main PID: 7740 (testscript.sh)
     CGroup: /user.slice/user-1000.slice/[email protected]/run-r1422e75c673a4439aaacefd0df118a51.service
             ├─7740 /bin/bash /home/hl/tmp/./testscript.sh
             └─7742 sleep 100

检查运行状态

最好的方法似乎是:

$ systemctl show dracut-shutdown.service | grep -e ActiveState -e SubState       
ActiveState=active
SubState=exited

$ systemctl show display-manager.service | grep -e ActiveState -e SubState
ActiveState=active
SubState=running

所以你可以grepSubState=running以及ActiveState=active一个干净的解决方案)。

相关内容