リモートボックスにsshを挿入し、リモートコンピュータがアクティブに使用されていない場合に、そこでジョブを実行するプログラムを作成したいと思います。私はclusterJobRunner@remoteBoxとしてログインし、他のユーザーはsomeLocalUser@remoteBoxとしてログインします。
リモートユーザーがPythonまたはJavaのいずれかを使用してボックスをアクティブに使用しているかどうかを確認する方法はありますか?
someLocalUserの煩わしさを回避することが目的の場合は、より低い優先度でジョブを実行することを検討できます。niceについては、ドキュメントを参照してください。
users
Javaでは、を使用してLinuxコマンドを実行しRuntime.exec()
、標準出力を取得して解析可能にすることができますString
。これを行うためのOSに依存しない方法はないと思います。
「積極的に使う」部分はトリッキーな部分だと思います。
別のユーザーがログインしているかどうかを確認するだけで十分な場合は、コマンドw
andwho
およびおそらくlast
andを使用できますlastlog
。これらすべてのコマンドは、マニュアルで検索できるいくつかのパラメーターです。
Java / Pythonから、これらのコマンドを実行して出力を解析できます。
一方、ツールw
とwho
ファイルutmp
を使用して情報を取得します。簡単なGoogleはJavaには何も表示しませんでしたが、Pythonには、コマンド出力を解析せずにファイルを直接読み取るために使用できるライブラリpyutmpを見つけました。utmp
ユーザーがログインして昼食に行ったかどうか(おそらく画面をロックするかどうか)は、まったく別の話です。
私は@EeroAaltonenによる答えを2番目にしています-あなたはあなたのものを下で実行するべきですnice
。Linuxコンピューターは、100%CPUビジーで実行できますが、追加のタスクがすべて下にある場合は、ユーザーにとって快適で高速ですnice
。スケジューラーはnice
、メインユーザーのタスクがアイドル状態のときにのみタスクを実行します。
ただし、マシンが使用されているかどうかを確認したい場合は、コマンドを調べることをお勧めしますw
。man w
プロンプトで試してください。このw
コマンドは、マシンの平均負荷、ユーザーのリスト、およびユーザーが使用している時間(実行中のバックグラウンドタスクとメインタスクの時間を含む合計時間)を出力します。
「積極的に使用する」とはどういう意味かを定義する必要があります。次のうち、「積極的に使用する」と定義しているのはどれですか。
#2が探しているものであり、ユーザーがsshを使用してのみログインする場合は、sshdデーモンにフックして、sshクライアントからの入力を受信しているかどうかを監視できます。
たとえば、ログインしているユーザーのsshdにstraceをアタッチすると、sshクライアントからの読み取りを監視できます。これが私のために働く例です:
$ for x in $(ps aux | grep sshd | grep "@pts" | sed -E 's/[^ ]+ +([0-9]*).*/\1/'); do {(sudo strace -p $x -eread 2>&1 | grep 'read(4' )&}; done
[1] 166396
[2] 166397
[3] 166399
[4] 166402
read(4, "\206\261\364\271\204\\\26S\3\"El\365W\352\35\375\242\205Qlu@$\2538\306\2777oW\230"..., 16384) = 36
read(4, "@s\2733d\355\17~\2550=\316`)3|^\340\f\252\242_\251\377d[l\221\210|z\37"..., 16384) = 36
read(4, "\5\214\261\25\322\222\242\221\313\314\4$\344\273\200\220a\233\345*\7\17\274\331\246\363f.\346\365\22\255"..., 16384) = 36
read(4, "\325\220<\0:\34^\235\346y\223\304\3061\212\203\373\371rD Rs\254oL*\260\22\234\372\27"..., 16384) = 36
read(4, "TXD\7\373~.\214\321\35\201\350\22\211\34J~m\\\270\364\243\267\261\207\323\224\314x\240i'"..., 16384) = 36
read(4, "\347\320\243\v/Z\213n\7\264\376\27\0340\30\364u!9\n\326\314)c\331\362\346\256\317E8\317"..., 16384) = 36
read(4, "\7\264\207\232\252xT\271\240Aq\210\21m\232l\306i\225\311\356\3
ここに表示されているのは、sshを使用してログインした各ユーザーのすべてのsshdフォークプロセスに対するファイル記述子4の読み取り呼び出しです。ファイル記述子4は、クライアント(YMMV)に接続しているソケットに割り当てられているようです。各行の出力は、ユーザー(またはスクリプト)がクライアントからサーバーに何かを送信していることを意味します。これは、ユーザーがシェルに何かを入力したことに対応しているようです。
あなたはその上に構築することができるかもしれません。