web-dev-qa-db-ja.com

なぜpkillreturn -9?

Python3でコマンドpkill -9 -f 'Java.*7104'を実行したいのですがsubprocess.runを使用しますが、なぜreturncode=-9なのかわかりません。誰かがこれを説明できますか?

>>> subprocess.run("pkill -9 -f 'Java.*7104'", Shell=True)
CompletedProcess(args="pkill -9 -f 'Java.*7104'", returncode=-9)

Bash Shellで同じコマンドを実行すると、戻りコードは0になります。

$ pkill -9 -f 'Java.*7104'
$ echo $?
0

bashシェルでコマンドを実行:

root@w-test01:/home/renyuntao# ps -ef | grep -E 'Java.*7104' | grep -v grep
root     127147      1 99 11:37 pts/1    00:00:13 Java -Djava.security.egd=file:/dev/./urandom -Xmx10240m -jar ./aichemy.jar --server.port=7104 --spring.profiles.active=test01_use
root@w-test01:/home/renyuntao# pkill -9 -f 'Java.*7104'
root@w-test01:/home/renyuntao# echo $?
0

コマンドを実行してsubprocess.runを使用

root@w-test01:/home/renyuntao# ps -ef | grep -E 'Java.*7104' | grep -v grep
root     128644      1 99 11:38 pts/1    00:00:22 Java -Djava.security.egd=file:/dev/./urandom -Xmx10240m -jar ./aichemy.jar --server.port=7104 --spring.profiles.active=test01_use
root@w-test01:/home/renyuntao# python3
Python 3.5.2 (default, Apr 16 2020, 17:47:17) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess
>>> subprocess.run("pkill -9 -f 'Java.*7104'", Shell=True)
CompletedProcess(args="pkill -9 -f 'Java.*7104'", returncode=-9)
1
Ren

subprocess.runShell=Trueと一緒に使用すると、Pythonはシェルプロセスを開始し、次にプロセスを開始します。これは、sh -c "pkill -9 -f 'Java.*7104'"を実行することを意味します。pkillプロセスには、親プロセスとの一致を回避するのではなく、それ自体との一致を回避するための特別な保護のみがあります。それ自体と一致しないように正規表現を調整する必要があります。Javaの前に^を置くことはおそらくこれを行う最も簡単な方法は、次のようになります。

subprocess.run("pkill -9 -f '^Java.*7104'", Shell=True)