我使用的是Debian的最小netinstall映像。这是我在第一次登录时启动用户进程和守护进程的脚本。它逐行读取由命令组成的文件,检查它们是否已经运行并启动它们,如果不是:
#!/bin/bash
## This script reads a list of user startup daemons and launches them after the first login
STAT=`who | grep "$USER" | wc -l` ## Get login count
if [ "$STAT" -eq 1 ] ; then ## If login shell
while IFS=' ' read line ## First attempt to separate fields fails
do
CMD=`echo "$line" | grep -v ^\#` ## Use non comment lines only
if [ -n "$CMD" ] ; then
eval set "$CMD" ## The actual field separation
APPID=$(pgrep "$1")&& ## Check if process $1 of $CMD is already active and launch it if not
(echo "$1 already active as "$APPID) || ("$@" 1>/dev/null&& echo "Started $1 as $(pgrep "$1")")
fi
done < ~/.scripts/daemons
echo "start-daemons: Finished"
else
echo "start-daemons: Not a login shell"
fi
命令~/.scripts/daemons
的文件如下所示:
## List of processes / daemons to start at user login
## <command> <argument1> <argument2> ..
mpd
pulseaudio -D
gpg-agent --daemon --enable-ssh-support --write-env-file /tmp/.gpg-agent-info
该脚本适用于mpd
。但问题是,由命令和(多个)选项(以及空格)组成的行不会被分割成字段。将字段分隔符IFS设置为&#39; &#39;没有区别,我觉得很奇怪。在这种情况下有什么问题?谢谢!
编辑:正如alvits所建议的那样,通过在while循环中评估set $line
进行字段分离,提供了一种简单的解决方法。但是为什么read line
首先没有分离?
答案 0 :(得分:0)
我认为你应该检查&#34; pgrep pulseaudio&#34; 。也就是说,仅使用进程/守护程序名称,而不是将进程/守护程序名称与选项一起提供。我没有机器,我现在可以测试它。这可以通过从每一行获取第一个字段(这将是进程/守护程序名称)来完成。同样的第二个。您可以尝试的另一件事是pgrep的&#34; -f&#34; 选项。试试让我知道
答案 1 :(得分:0)
知道了:read
需要知道应该拆分一行的字段。通过将第6行更改为
while IFS=' ' read field1 field2
field1将包含该命令,而field2具有选项,可以再次包含空格,因为field1之后的任何内容都属于field2。