我有六个 shell 脚本,当我登录时会启动它们。shell 脚本会启动 Python 脚本,这些脚本会从网络上抓取各种内容,比如新闻标题、天气信息等,然后我通过 conky 将它们添加到我的桌面。
问题是每次启动所有这些 shell 脚本真的很麻烦。
我已经寻找并尝试了一些东西,但似乎没有任何效果。
有人能告诉我最好的方法吗?顺便说一句,我无法将 shell 脚本合并到一个文件中,因为它们在应用初始命令后都会“休眠”不同的时间。
谢谢。
-- 编辑(添加以下评论)--
所有脚本均具有以下格式:
#!/bin/bash
while true; do
python /home/scott/debkaget.py > /home/scott/debka.txt
sleep 120
done
可以将其添加到配置文件中吗?我需要睡眠功能。我正在运行 KDE 4.9。
答案1
如果您正在“添加到桌面”,则您正在运行窗口管理器,如果您正在使用 bash,则可能是 Linux。在这种情况下,您最好从 Xsession 文件(或变体)将脚本启动到后台~/.Xsession
。/etc/X11/Xsession
有关更多信息,请尝试
man 5 Xsession
man 1 xinit
答案2
一种可能性是将适当的调用添加到您的.bash_profile
或.profile
文件中。当您手动运行它们时,您是否&
在末尾添加了一个以在后台运行它们?如果是这样,请在您的配置文件中也这样做。
这里的主要问题是“如果您已经运行了登录 shell,会发生什么情况”。如果有另一个副本正在运行,这 6 个脚本是否会表现正常?它们是否会费心检测是否有另一个副本正在运行。
如果您登录的是 GUI 桌面,则有多种方式可以在桌面启动时运行程序;使用它来运行您要处理的脚本。要获得更准确的说明(来自其他人),请提供有关您的环境的更多信息。
答案3
您可以使用这个基本策略:
- 让脚本通过创建 pid 文件来启动
script_name.pid
。如果脚本的 pid 文件存在,则终止脚本 - 让脚本在后台运行
当你从 .bash_profile (或类似文件)调用时进程号文件将阻止 .bashrc 为每个新 shell 结束更多进程。
根据 NormanRamsey 的说法,您将添加到 XSession(或其他窗口管理器):
# Web Scrapers
runshell_yahoonews.sh
runshell_blog_disney.sh
runshell_stackoverflow_election.sh
runshell_twitter_dad.sh
runshell_twitter_origamistork.sh
runshell_blog_daringfireball.sh
考虑写作bash 函数. 你可以有一个文件lib_scrapers.sh
#!/bin/bash
pid_path = "~/.X-scrapers/"
suff = '.pid'
function pidfile_create(invoker) {
if [ ! -e $pid_path$invoker$suff ];
then
# make it
echo $$ > $invoker$suff
else
# alert it existance
cat $pid_path$invoker$suff
fi
}
function pidfile_destroy(invoker) {
rm $pid_path$invoker$suff
if [ -e $pid_path$invoker$suff ];
then
echo "$pid_path$invoker$suff could not be destroyed properly"
fi
}
然后在每个爬虫程序的第 2 行(例如runshell_yahoonews.sh
)。如果爬虫程序已在运行,这将阻止脚本执行。
lib_scrapers.sh
if [ pidfile_create($0) ]
then
exit
fi
在每个刮刀的末端,放
pidfile_destroy($0)
您可能有其他权衡,但对于您所描述的,这听起来是合理的。