もっとカッコイイ方法はあると思いますが、とりあえずこんな感じで…
# ./sleep.sh /var/run/sleep.pid
sleep.sh
#!/bin/sh su - sleep -c "sleep 60 & echo $! > /tmp/sleep.pid" mv /tmp/sleep.pid $1
まず、指定ユーザー(sleep)がプログラム(sleep 60)を実行した後に
“/tmp”下にPIDファイルを書き出しています。
(パーミッションの問題で直接”/var/run/”下に書き出せない)
そして、”root”で”/var/run/”下にPIDファイルを移動しています。
ポイントは、プロセスIDを取得する変数”$!”
をバックスラッシュでエスケープ(\$!)しているところでしょうか?
上記コマンド実行後、下記のように”sleep”ユーザーで実行されているのがわかり
# ps aux | grep sleep sleep 2822 0.0 0.0 107888 620 ? S 23:11 0:00 sleep 60 root 2825 0.0 0.0 110400 860 pts/0 S+ 23:11 0:00 grep sleep
プロセスIDも問題なく書きだされていることが確認できます。
# cat /var/run/sleep.pid 2822