我有一个脚本,每次运行我的PHP脚本X次:
#!/bin/bash
while true; do
/usr/bin/php -f ./my-script.php
echo "Waiting..."
sleep 3
done
如何将其作为守护进程启动?
我有一些bash脚本,有一些统计信息,如磁盘信息,内存使用等等.但它只在脚本运行和关闭后显示一次信息.我可以重复运行此脚本(例如"htop")或类似的东西吗?我想在5-10秒后更新此信息.谢谢!
我写了一个小的C实用程序,killSPR用来杀死RHEL盒子上的以下进程.这个想法适用于登录这个linux盒子的人能够使用这个实用程序杀死下面提到的进程(这不起作用 - 如下所述).
cadmn@rhel /tmp > ps -eaf | grep -v grep | grep " SPR "  
cadmn    5822  5821 99 17:19 ?        00:33:13 SPR 4 cadmn  
cadmn   10466 10465 99 17:25 ?        00:26:34 SPR 4 cadmn  
cadmn   13431 13430 99 17:32 ?        00:19:55 SPR 4 cadmn  
cadmn   17320 17319 99 17:39 ?        00:13:04 SPR 4 cadmn  
cadmn   20589 20588 99 16:50 ?        01:01:30 SPR 4 cadmn  
cadmn   22084 22083 99 17:45 ?        00:06:34 SPR 4 cadmn  
cadmn@rhel …我有一个 postgresql-plsh 函数
    CREATE OR REPLACE FUNCTION MDN_REG_LOCATE(MDN VARCHAR(50), CALLID VARCHAR(50)) RETURN AS '
    #!/bin/sh
    /home/infoobjects/Projects/java/execute.sh $1 $2 &
logger -t "data" "$1$2"
    ' LANGUAGE plsh;
和 execute.sh 调用是一个需要 3 分钟执行的 java 进程(方法)。我已经通过在脚本(execute.sh)末尾附加 & 使脚本异步我的问题是 postgresql 函数仍然等待结果到来并且不会以异步方式运行,尽管 shell 脚本异步运行,因为上面的记录器函数在调用 MDN_REG_LOCATE() 之后登录,但这个 postgresql 函数(MDN_REG_LOCATE) 仍然等待 3 分钟的完整过程结束,我不知道我缺少什么,请帮助我。
感谢 Adv。
通常我会添加"&"字符来启动我在backgroud中的过程,例如:
user@pc:~$ my_script &
但是如何在没有"&"字符的背景下制作呢?
#!/bin/bash
#What can I add here to hide current process ($$) and to release focus ?
start_server()
{   
    #my script here with infinite loop ...
}
多谢你们.
我有一个服务器进程(从systemd启动),可以启动更新进程。更新过程自我自我守护,然后(理论上)使用SIGTERM杀死服务器。我的问题是SIGTERM传播到更新过程,它是子进程。
出于调试目的,更新过程只是休眠,我手动发送了kill。
杀死之前的示例PS输出:
    1  1869  1869  1869 ?           -1 Ss       0   0:00 /usr/local/bin/state_controller --start
 1869  1873  1869  1869 ?           -1 Sl       0   0:00  \_ ProcessWebController --start
 1869  1886  1869  1869 ?           -1 Z        0   0:00  \_ [UpdateSystem] <defunct>
    1  1900  1900  1900 ?           -1 Ss       0   0:00 /bin/bash /usr/local/bin/UpdateSystem refork /var/ttm/update.bin
 1900  1905  1900  1900 ?           -1 S        0   0:00  \_ sleep 10000
请注意,UpdateSystem在单独的PGID和TPGID中。(该<defunct>过程是守护进程的结果,而不是(我认为)问题。)
UpdateSystem是一个bash脚本(尽管如果有帮助的话,我可以轻松地使其成为C程序)。从/sf/answers/2037538051/获得的守护程序代码之后,有趣的是:
#############################################
trap "echo Ignoring SIGTERM" SIGTERM
sleep 10000
echo …我通常启动长时间运行的 shell 脚本的方式是
\n\n% (nohup ./script.sh </dev/null >script.log 2>&1 & )\n重定向关闭stdin,然后重新stdout打开stderr;nohup当所属进程退出时,停止 HUP 到达该进程(我意识到这有点2>&1多余,因为nohup无论如何它都会做类似的事情);子 shell 中的后台是双叉,这意味着./script.sh进程的父进程在仍在运行时已退出,因此它获取 init 进程作为其父进程。
然而,这并不完全有效,因为当我退出调用它的 shell 时(当然,通常我是在远程计算机上执行此操作),它不会完全退出。我可以^C退出,这是可以的 \xe2\x80\x93 该进程确实按预期在后台进行。然而,我无法弄清楚需要/不发生什么^C,这让我很恼火。
上面的操作似乎勾选了unix FAQ(问题 1.7)中的大部分框,除了我没有做任何事情来将该进程与控制终端分离,或者使其成为会话领导者。FreeBSD 上存在setsid(2) 调用,但不存在该setsid命令;据我所知,也没有明显的替代命令。当然,在 macOS 上也是如此。
所以,问题是:
\n\nsetsid这个平台上是否有我失踪的不同名称的呼叫者?^C?有什么办法可以咬我吗?简单的问题:有没有办法在后台运行脚本而不运行终端?
更多细节和背景:我有一个应用程序,它读取应用程序.log文件和来自它的信息,然后从日志中的信息提供信息和统计信息.对应用程序的更新改变了.log文件的编写方式,并以我无法预测的方式删除信息并复制日志.
设计用于与日志交互的应用程序未编码以检查此类更改.因此,当它在日志更改后尝试收集信息时,它会停止工作.
已经设计了一个"hack"来运行tail -f,然后将应用程序篡改为指向新文件.("hack"有效)我想在后台运行尾部,这样用户就不会打断它......打破它......
- (可能)比所需描述更长的时间.我认为更详细的问题会得到一个确切的答案.
提前致谢!
〜¥oseph