プロセス名は表示されない
コマンド文字列として表示されているものという意味だと思います。
$ ps -ef | head -2
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 16:39 ? 00:00:01 /sbin/init splash
^^^^^^^^^^^^^^^^^
実験してみるとスクリプト名をpgrepに渡しても見つけてくれました。しかし、./シェル名
のようにして実行するとpgrepが見つけてくれませんでした。そこで次のように書いてみるとなんとなく動きました。$0をpgrepへ渡す前に先頭の./
を除去しているだけのものです。
sh
1#!/bin/bash
2#set -v
3echo "0 = $0"
4sc="echo $0"
5sc=`$sc | sed 's/^\.\///'`
6echo "sc = $sc"
7
8#ps -ef | grep sh
9
10pid=`pgrep $sc`
11echo 'pid = ' $pid
12if [ "$$" = "$pid" ] ; then
13 echo does not exist
14else
15 echo exists
16 ps -f -p $pid
17fi
18# 起動中のテスト用のread
19read
ちなみに、Linuxの色々なディストリビューションでコマンドの仕様やシェルの仕様が微妙に違うことが多いと思いますので注意が必要ですね。上のスクリプトはUbuntuでたまたま動くように見えるという程度のものです。
なんかありそうなので探してみるとやはり記事があります。上のようなテキトーなものを作るよりこうしたものは記事を参照したほうがいいかもですねw;
シェルスクリプトの二重起動防止
記事をみるとsedなんて使ってなくてbasenameでやってます orz
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/02/12 00:55