pcmanfm
次のようにprocessIDを取得しようとしています。
pgrep -f "pcmanfm"
実行されない場合、pcmanfm
上記のコマンドは期待どおりに何も返しません。
ただし、Pythonでコマンドを実行すると、pcmanfm
実行していない場合でもプロセスIDが返されます。
processID = os.system('pgrep -f "pcmanfm"')
また、python3プロンプトで上記のコマンドを複数回実行すると、毎回異なるプロセスIDが返されます。その間、pcmanfm
これらの命令よりも閉鎖が最初に行われました。
>>> processID = os.system('pgrep -f "pcmanfm"')
17412
>>> processID = os.system('pgrep -f "pcmanfm"')
17414
>>> processID = os.system('pgrep -f "pcmanfm"')
17416
pcmanfm
現在実行されていない場合、ブート機能は本当に混乱します。私のスクリプトは実行中だと思いますが、実際にはそうではありません。
なぜこれが起こるのですか?
実際にこの問題にぶつかりました。自動キーこれに基づいて私が書こうとしたスクリプトは動画私はそれを見た。これは私の現在のスクリプトです。
processID = system.exec_command('pgrep -f "pcmanfm" | head -1',True)
dialog.info_dialog("info",processID)
if (processID):
cmd = "wmctrl -lp | grep " + processID + " | awk '{print $1}'"
windowID = system.exec_command(cmd,True)
# dialog.info_dialog("info",windowID)
cmd = "wmctrl -iR " + windowID
#dialog.info_dialog("info",cmd)
system.exec_command(cmd,False)
else:
#os.system("pcmanfm /home/user/Downloads")
cmd = "/usr/bin/pcmanfm /home/user/Downloads"
system.exec_command(cmd,False)
問題は、pcmanfm
実行していないのにprocessIDを取得し続けることです。スクリプトがpcmanfm
実行されている場合は正しく焦点を当てますが、それ以外の場合は起動しません。
修正する:ついにこのスクリプトを取り出して-f
交換して動作させました(@theyの提案)。-nx
また、予想される空の出力に起因する自動キー例外を無視するために、いくつかの例外処理を追加しました。また、より広い範囲のコマンド/アプリケーションを提供できるように(より柔軟な)機能に変換しました。
import re
def focusOrLaunch(launchCommand):
appName = re.findall('[^\s/]+(?=\s|$)',launchCommand)[0]
processID = None
try:
processID = system.exec_command('pgrep -nx "' + appName + '"',True)
except Exception as e:
#dialog.info_dialog("ERROR",str(e))
pass
#dialog.info_dialog("info",processID)
if (processID):
cmd = "wmctrl -lp | grep " + processID + " | awk '{print $1}'"
windowID = system.exec_command(cmd,True)
# dialog.info_dialog("info",windowID)
cmd = "wmctrl -iR " + windowID
#dialog.info_dialog("info",cmd)
system.exec_command(cmd,False)
else:
system.exec_command(launchCommand,False)
cmd = "/usr/bin/pcmanfm ~/Downloads"
focusOrLaunch(cmd)
ベストアンサー1
提案されたソリューション:
-f
コマンドからこのオプションを削除しますpgrep
。
説明する:
コマンドを実行するために実行されたシェルのプロセスIDを取得できます。それぞれに使用されますsystem.exec_command
。
たとえば、実行してsh -c 'pgrep -af nonexistent'
出力を確認します。あなたは次のようなものを得ることができます
11300 sh -c pgrep -af nonexistent
既存のコマンドを使用してシェルでも1行を取得しました。
sh -c 'pgrep -af sshd'
695 /usr/sbin/sshd -D
11207 sshd: pi [priv]
11224 sshd: pi@pts/0
11331 sshd: [accepted]
11343 sh -c pgrep -af sshd
PID値に応じて、コマンドはhead
探しているプロセスのPIDまたはシェルプロセスのPIDを抽出できます。
オプションを使用すると、プロセス名だけでなくコマンドライン全体を検索するように-f
明示的に指示できます。pgrep
これにより、シェルのコマンドライン引数で文字列を見つけることができます。
これがなければ、-f
シェルプロセスを取得できません。
$ sh -c 'pgrep -a sshd'
695 /usr/sbin/sshd -D
11207 sshd: pi [priv]
11224 sshd: pi@pts/0
11364 sshd: [accepted]