ユーザーがログインしたときにまだ実行されていないコマンドを実行する方法

ユーザーがログインしたときにまだ実行されていないコマンドを実行する方法

SSHを介してヘッドレスサーバーに接続するとき、一連の悪いデーモンを実行することがよくあります。到着私の酒の中のビールを監視するヘイ到着Webブラウザでサーバー自体を監視する

私は次の両方を実行してこれを行いますscreen

screen -d -m psdash
screen -d -m kegbot runserver xxx.xx.x.xxx:8008

画面外のこれら2つのコマンドは、セッションの残りの部分を使用できなくするstdout方法で支配的な傾向があります。sshまた session で終了するので、sshscreen が最善の選択だと思います。

私の質問は:ログイン時にこれらのコマンドを実行する方法や他の方法はありますか?.profileしかし、すでに実行している場合はそうではありませんか?その最後の部分は私を避けます。

ベストアンサー1

開始する両方のプロセス(および)$!の両方のファイルにプロセスの開始後にPID(bashで)を作成することをお勧めします。psdashkegbot

その後、これを使用してps --pid $(cat your.pid) | tr -s ' ' | sed 1d | cur -d' ' -f4プロセスが実際に実行されていることを確認できます。

.pidただし、ファイルを操作する前に、ファイル内のPIDが有効であることを常に確認してください。

プログラムが停止すると、ファイル.pid(通常はプログラム自体の一部またはシェルスクリプトラッパー)を削除するために使用するメカニズムが何であれ、ファイルの「無効な」PIDが原因で失敗する可能性があります.pid。再起動後もファイルが持続する場合、.pid最悪のシナリオはタスクを実行したい他のプロセスのPIDになります。


kegbot良いです。たとえば、考えられる解決策は次のとおりです。

まず、ラッパースクリプトが必要です。単純化のために$HOME

したがって、単純なラッパー(run_kegbot.sh)は次のようになります。

#!/bin/zsh
kegbot runserver xxx.xx.x.xxx:8008
echo $! > kegbot.pid
wait
rm -rf kegbot.pid

kegbotこれはバックグラウンドでフォークするなどの場合の解決策ですが、フォーク後にPIDが有効な場合です。kegbotPIDファイルを直接処理できる場合は、PIDファイルを直接処理するのに苦労する可能性があります。あるいは、kegbot背景に分岐し、シェル自体を使用して(&行2の末尾にaを追加して)、PIDファイルに書き込んで完了するまで待つことはできません。

とにかくPIDファイルMalarkeyを完成したら、以下を追加する必要があります.profile

[ -e kegbot.pid ] && {
    PID=$(cat kegbot.pid)
    COMM=$(ps -p $PID -o comm=)
    [ "x$COMM" != "xkegbot" ] && rm -f kegbot.pid 
}

[ -e kegbot.pid ] || screen -d -m ./run_kegbot.sh

繰り返しますが、これはただ一つ問題に対する解決策ですが、一般的なアイデアは、プロセスのPIDを使用して実行中であることを確認することです。上記の方法はこれを行う1つの方法です。

一部のデーモンはPIDファイルを保存または/var/run/実行kegbotします。psdashこれらのPIDファイルは直接使用できるため、ラッパースクリプトなどは必要ありません。

PIDファイルのPIDが実際にそれが属するプロセスであることを確認する必要があります。悪意のある再起動やデーモンのクラッシュにより、ゾンビ化されたPIDファイルなどが残る可能性があります。上記のPIDファイルの最初のテストの目的は次のとおりです。

おすすめ記事