在 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
所以你可以grep
(SubState=running
以及ActiveState=active
一个干净的解决方案)。