もっとカッコイイ方法はあると思いますが、とりあえずこんな感じで…

# ./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

元記事はこちら

指定したユーザーで実行したプログラム(su – user -c program)のPIDファイルを作成する