0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【csh】foreachでプロセス稼働確認・一括プロセスkillの実装

Last updated at Posted at 2023-09-13

cshってfor文ないんだって...

世の中色んなプログラミング言語がありますけど、
for文がない言語なんてあるのでしょうか?

それがあるんです。
ズバリcsh

cshはfor文がありませんが、
ループ構文が無いわけではありません。

代わりに用意されているのがforeachとなります。

foreach

基本構文
foreach 変数 ( リスト )
    コマンド
end

foreachは()内でリストファイルの中身を一つずつ取り出し、
指定した変数に値を格納します。
リスト内からすべての値を取り出したらループ終了です。

リストに変数の値を使用する

リストはスペース区切りで判定されます。
なので変数に以下のように値を定義することで、
foreachで扱えるリストが作成できます。

set lists = "test1 test2 test3"

この仕組みを利用して以下のような処理作成してみました。

プロセス確認を行う

プロセス起動有無確認
set processes = "OneDrive firefox"

foreach pname(${processes})
	set pcount = `ps aux | grep "${pname}" | grep -v "grep" | wc -l`
	if ( 0 < $pcount ) then
		echo "${pname}:稼動状態"
	else if ( $pcount == 0 ) then
		echo "${pname}:停止状態"
	else
		echo "カウント値が不正です"
	endif		
end

処理概要
プロセス名は任意ですがここでは"OneDrive"と"firefox"とします。

  • 変数"process"に起動有無を確認したいプロセス名をスペース区切りで定義します。
  • 変数process内の値をforeachで取り出し、変数pnameに格納します。
  • psコマンドの出力結果をgrepで絞ります。同名のプロセスが稼働していれば"wc -l"で行カウントされます。
  • カウントの結果を変数pcoutに格納しif文で判定処理を行います。
実行結果
OneDrive:起動中
firefox:起動中

リストから一括でプロセスkillを行う

一括kill
set processes = "OneDrive firefox"

foreach pname($processes)
    set pid = `ps aux | grep "${pname}" | grep -v "grep" | awk '{print $2}'`
    kill -15 $pid	
end

基本はプロセス確認と同じです。
awkでPIDを抜き出して、そのPIDに対してkillしています。

余談

Unix系のforは他のPG言語と異なり、
ちょっと変わった書き方をしますが、
その面cshの書き方はわかりやすいですね。

cshはC言語っぽい書き方を特徴としているため、
生粋の開発者からすると他のシェルよりも書きやすいのかもしれませんね(私は開発者ではないですが、、、)

追記:cshはシェルスクリプトには向かないそうです。詳細はコメント欄

自分が運用などで面倒を見たシステムなどはなぜかcshでスクリプトが記載されていることが多いですが(ログインシェルはcshではないのに...)ここら辺が起因しているのだろうか?

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?