网站开发支付功能,做网站的属于什么行业,中国空间站图片绘画,北京搜索关键词优化Linux附带了大量命令#xff0c;每个命令都是唯一的#xff0c;并在特定情况下使用。Linux timeout命令的一个属性是时间限制。可以为任何命令设置时间限制。如果时间到期#xff0c;命令将停止执行。
如何使用timeout命令
我们将解释如何使用Linux timeout命令 timeout […Linux附带了大量命令每个命令都是唯一的并在特定情况下使用。Linux timeout命令的一个属性是时间限制。可以为任何命令设置时间限制。如果时间到期命令将停止执行。
如何使用timeout命令
我们将解释如何使用Linux timeout命令 timeout [OPTION] DURATION COMMAND [ARG]… timeout [OPTION] DURATION可以是正整数或浮点数后跟可选的单位后缀
s - seconds (default)
m - minutes
h - hours
d - days未使用单位时默认为秒。如果持续时间设置为零则禁用关联的超时。
其他选项
DESCRIPTION--preserve-status以与COMMAND相同的状态退出即使命令超时--foreground当不直接从shell提示符运行超时时允许COMMAND从TTY读取并获得TTY信号在此模式下COMMAND的子级不会超时-k, --kill-afterDURATION如果COMMAND仍在运行也发送KILL信号在发出初始信号后很久-s, --signalSIGNAL指定超时时要发送的信号SIGNAL可以是类似“HUP”的名称或数字有关信号列表请参见“kill-l”--help显示此帮助并退出 --version输出版本信息并退出
如何使用timeout命令的基本示例
1.设置定时间后终止命令 timeout 30 ping www.baidu.com 通过使用超时我们可以确保ping不会一直运行占用网络带宽并纠缠任何正在ping的设备。
此命令允许ping运行五秒钟。它正在对www.baidu.com的域名进行ping用于研究本文的测试网络上。
如果程序的执行在超时终止之前结束超时可以将退出代码从程序传递回shell要实现这一点程序必须自动停止换句话说它不会因超时而终止并且必须使用–preserve-status选项。
如果使用值为5的-ccount选项ping将只发出5个请求。如果我们给超时一分钟ping肯定会自行终止。然后我们可以使用echo检查退出值。 2.发送正确的信号
当timeout想要停止程序时它会发送SIGTERM信号。这礼貌地要求程序终止。某些程序可能选择忽略SIGTERM信号。
我们可以通过请求超时来发送SIGKILL信号来实现这一点。可以使用-ssignal选项告诉超时以发送SIGKILL信号。 timeout -s SIGKILL 20 sudo tcpdump -i ens33 -n -w 20230212.pcap 我们可以使用tcpdump 抓包的默认选项运行20秒后发送SIGKILL信号终止进程。
3.尝试使用SIGTERM停止程序
我们使用-kkill after选项。-k选项需要一个时间值作为参数。在这个命令中我们要求超时让dmesg运行30秒然后用SIGTERM信号终止它。如果dmesg在40秒后仍在运行则意味着外交SIGTERM被忽略超时应发送SIGKILL以完成任务。 timeout -k 40 30 dmesg -w dmesg运行30秒并在收到SIGTERM信号时停止。
Linux C/C timeout命令实现
...
int main(int argc, char** argv) {
...for(int i1;iargc;i) {char* arg argv[i];if(strlen(arg) 0) continue;if(arg[0] -) {if(!strcmp(arg, -h) || !strcmp(arg, --help)) {printHelp(argv[0]);return EXIT_SUCCESS;} else if(!strcmp(arg, -9) || !strcmp(arg, --kill)) {sig_kill SIGKILL;...} else {fprintf(stderr, Illegal argument: %s\n, arg);return EXIT_FAILURE;}} else {/* 没有更多选项。检查是否有足够的剩余参数基本语法是/程序[OPTIONS]超时程序[ARGS]而超时和程序是强制性的 */if (i2 argc) { // 检查是否给出超时和程序fprintf(stderr, Not enough arguments. Check %s --help, if you need help\n, argv[0]);if(i1 argc) {// 检查参数是否为数字fprintf(stderr, Missing: TIMEOUT PROGRAM\n);} else {if(is_numeric(argv[i]))fprintf(stderr, Missing: PROGRAM\n);elsefprintf(stderr, Missing: TIMEOUT\n);}return EXIT_FAILURE;} else {int seconds atoi(argv[i]);if(seconds 0) {fprintf(stderr, Timeout cannot be negative);return EXIT_FAILURE;}timeout (unsigned int)seconds;// 合并程序和可选程序参数for(int ji1;jargc;j)command strappend(command, argv[j]);break;}}}// 检查程序参数if(command NULL || strlen(command) 0) {fprintf(stderr, Not enough arguments. Check %s --help, if you need help\n, argv[0]);fprintf(stderr, Missing: TIMEOUT PROGRAM\n);return EXIT_FAILURE;}// Fork守护程序如果需要if (daemonize) {fork_daemon();}...int status;pid_t wait_status;// 信号处理器signal(SIGINT, sig_handler);signal(SIGTERM, sig_handler);signal(SIGALRM, sig_handler);if(verbose) printf(Child process forked with pid %d.\n, proc_pid);// 设置报警if(timeout 0) alarm(timeout);wait_status waitpid(proc_pid, status, 0); // Wait for childruntime millis();if(wait_status 0) {fprintf(stderr, Error waiting for process: %s\n, strerror(errno));return EXIT_FAILURE;}status WEXITSTATUS(status); // 获取实际退出状态if(status ! 0) {if(verbose) fprintf(stderr, Process exited with status %d after %ld milliseconds\n, status, runtime);return status;} else {if(verbose) printf(Process completed after %ld milliseconds\n, runtime);return status;}}...
}
...
static void sig_handler(int sig_no) {switch(sig_no) {case SIGALRM:// Timeoutif(verbose)printf(TIMEOUT after %ld milliseconds.\n, runtimemillis());elseprintf(TIMEOUT\n);terminate_process();exit(EXIT_FAILURE);break;case SIGINT:case SIGTERM:if(proc_pid 0) exit(EXIT_FAILURE);if(verbose) printf(Program termination request\n);if(proc_pid 0) kill(proc_pid, sig_no);exit(EXIT_FAILURE);return;}
}...编译运行 If you need the complete source code of timeout, please add WeChat number (c17865354792)
总结
总结
timeout是一个命令行实用程序它运行指定的命令如果在给定的时间段后仍在运行则终止该命令。
Welcome to follow WeChat official account【程序猿编码】