時計にコマンドを再評価させる

時計にコマンドを再評価させる

こんにちは、次のようにwatchコマンドを実行するのに問題があります。

 watch cat /proc/$(ps ax | grep processname | grep -v grep | awk '{print $1}')/status

このコマンドは起動時に機能します。しかし、見ているプロセスを再起動しましたが、watchコマンドはまだ古いプロセスIDを使用します。プロセスIDを更新し、同じ名前の新しいプロセスのステータスを表示したいと思います。この部分は$(ps ax | grep processname | grep -v grep | awk '{print $1}')明らかに最初にのみ実行されます。時計が更新されるたびに出力をどのように再評価できますか?

catコマンドをbashスクリプトに入れ、watchでスクリプトを実行したくありません。

答え1

これはきちんとしたアプローチではありませんが、実際にスクリプトを生成する意思がない場合です。あなたは試すことができますeval

 watch eval 'cat /proc/$(ps ax | grep processname | grep -v grep | awk '"'"'{print $1}'"'"')/status'

答え2

以下をps-status.sh$ PATHの場所に保存し、次のコマンドを使用して実行可能にしますchmod +x

#!/bin/sh

[ -z "$1" ] && echo "process name required" && exit 1

pid="$(pgrep -f "$1")"

[ -z "$pid" ] && echo "no such process: $1" && exit 1

countpids="$(echo "$pid" | wc -l)"
[ "$countpids" -gt 1 ] && "Warning: more than one pid matches $1" && exit 1


cat "/proc/$pid/status"

watch次に、次のように実行します。

watch ps-status.sh processname

$pidおそらく配列でなければなりませんが、shだけでなくbashも必要です。

#!/bin/bash

[ -z "$1" ] && echo "process name required" && exit 1

pids=( $(pgrep -f "$1") )

[ "${#pids[@]}" -eq 0 ] && echo "no such process: $1" && exit 1
[ "${#pids[@]}" -gt 1 ] && echo "Warning: more than one pid matches $1"

# display first matching PID, even if there were more than 1 matching.
cat "/proc/${#pids[0]}/status"

答え3

スクリプトファイル

#!/bin/bash
ps -eaf | grep -i processname| grep -v grep |awk '{print $2}'
/etc/init.d/servicename restart

説明する

crontabが1分ごとに実行されるようにスケジュール

次に、次の watch コマンドを使用して、プロセス名が再始動した後のプロセス ID の違いを確認します。

watch -n 60 script.sh  

答え4

一重引用符を使用して、$(...)その項目を実行する対話型シェルによって拡張されるのを防ぎます。その後、一時的に二重引用符に切り替えてから戻り、一重引用符をエスケープする必要があります。したがって、以下が機能します。

watch cat /proc/'$(ps ax | grep processname | grep -v grep | awk '"'"'{print $1}'"'"')'/status

ただし、ここで一般的に実行される操作を理解するには、フラグ以外のすべての引数が最初にコマンド文字列に連結されることにwatch注意してください。watchこれは「助けになるために」行いますが、実際には何が起こっているのか曖昧にするため、非生産的だと思います。常にコマンド文字列を指定すると、よりクリーンでわかりやすくなると思います(この場合、インタラクティブシェルがその中の内容を拡張しないように単一引用符で囲みます)。

watch 'cat /proc/$(ps ax | grep processname | grep -v grep | awk '"'"'{print $1}'"'"')/status'

関連情報